wxZipInputStream и wxRemoveFile Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
deniman
In need of some credit
In need of some credit
Posts: 9
Joined: Sat May 02, 2009 7:46 pm

wxZipInputStream и wxRemoveFile

Post 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.

Как можно еще удалить файл?
van_user
Experienced Solver
Experienced Solver
Posts: 55
Joined: Wed Jun 11, 2008 9:28 pm
Location: UA

Post by van_user »

Пробуй:
ZipStream. CloseEntry( )
deniman
In need of some credit
In need of some credit
Posts: 9
Joined: Sat May 02, 2009 7:46 pm

Post by deniman »

van_user wrote:Пробуй:
ZipStream. CloseEntry( )
Забыл дописать.
Я это использую, но результат тот же. Файл можно удалить тогда, когда wxZipInputStream полностью выгружаеться из памяти, т.е. когда идет завершение функции.
Kolya
Experienced Solver
Experienced Solver
Posts: 85
Joined: Mon Dec 11, 2006 11:35 am
Location: /dev/null

Post by Kolya »

Похоже, что вы хотите удалить файл, из которого в это же время читаете данные

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

Code: Select all

{
    wxZipInputStream ZipStream("zipfile.zip", "file.txt");
    ...
    // Читаю данные из файла
    ...
}
wxRemoveFile("zipfile.zip");
deniman
In need of some credit
In need of some credit
Posts: 9
Joined: Sat May 02, 2009 7:46 pm

Post 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(); }. Т.е. похоже, что это единственный способ, прочитать-удалить.
Post Reply