Page 1 of 1

wxZipInputStream и wxRemoveFile

Posted: Thu Aug 20, 2009 2:50 am
by deniman
Не получается удалить файл, после открытия его через wxZipInputStream.

Делаю так:

Code: Select all

wxZipInputStream ZipStream("zipfile.zip", "file.txt");
...
// Читаю данные из файла
...
wxRemoveFile("zipfile.zip");
Посмотрел код ошибки и расшифровку: The process cannot access the file because it is being used by another process.

Как можно еще удалить файл?

Posted: Thu Aug 20, 2009 7:07 am
by van_user
Пробуй:
ZipStream. CloseEntry( )

Posted: Thu Aug 20, 2009 7:29 am
by deniman
van_user wrote:Пробуй:
ZipStream. CloseEntry( )
Забыл дописать.
Я это использую, но результат тот же. Файл можно удалить тогда, когда wxZipInputStream полностью выгружаеться из памяти, т.е. когда идет завершение функции.

Posted: Thu Aug 20, 2009 9:43 pm
by Kolya
Похоже, что вы хотите удалить файл, из которого в это же время читаете данные

А вот так подойдет?

Code: Select all

{
    wxZipInputStream ZipStream("zipfile.zip", "file.txt");
    ...
    // Читаю данные из файла
    ...
}
wxRemoveFile("zipfile.zip");

Posted: Fri Aug 21, 2009 7:07 am
by deniman
Да это работает. Работает еще и так:

Code: Select all

wxZipInputStream pZipStream = new wxZipInputStream("zipfile.zip", "file.txt");
...
// Читаю данные из файла
...
delete pZipStream;

// И только после этого можно удалить файл.
wxRemoveFile("zipfile.zip");
Но по сути проблема так и не решена, т.к. как же все-таки можно "сказать" потоку, что файл можно закрывать. Как мне кажется, указатели нужно использовать только там, где это требуется хранить данные вне блока. А иначе можно случайно обраться, к несуществующим данным.

P.S. Посмотрел исподники. Для чтения файла, wxZipInputStream использует wxFileInputStream, а тот уже пользуется wxFFile, деструктор которого выглядит так ~wxFFile() { Close(); }. Т.е. похоже, что это единственный способ, прочитать-удалить.