Page 1 of 1
Мистическая ошибка памяти
Posted: Wed Mar 25, 2009 8:34 pm
by SmileGobo
Как вы могли заметить я пишу архиватор, в учебных целях.
В обработчике события распаковки архива валиться ошибка, причем валиться она, если распаковываю в корень диска, если распаковывать в директорию то вроде все норм.
файл archivatorMain.cpp
Code: Select all
void MyFrame1::OnUnpackFiles(wxCommandEvent& event){
if(!m_grid1->GetNumberRows()>0){
//Запись в лог
return;
}
Zip arhiv(m_grid1->GetFiles());
//wxMessageBox(wxEmptyString);
arhiv.Unpack(m_dirPicker1->GetPath(),*m_statusBar1);
}
Но самая главная мистика заключается в том, что если раскоменить строку wxMessageBox(wxEmptyString); то все нормально.
ЗЫ файлы распаковываются нормально.
Уверен что я где-то глупо ошибся. Но я не как не могу понять где.
архив не прилепляется больно большой =\
http://webfile.ru/3303596
Posted: Thu Mar 26, 2009 8:11 am
by borr_1
Что за Zip это твой класс? А что там внутри достопочтенное собрание должно угадать?
Posted: Thu Mar 26, 2009 8:14 am
by SmileGobo
не был уверен что стоит выкладывать весь код в сообщение, поэтому выложил архив с файлами где и класс Zip и все остальные классы есть.
Posted: Thu Mar 26, 2009 8:40 am
by borr_1
Ну во первых ты бы рассказал что говорит отладчик на какой конкретно строе валиться. Не обижайся, но ради праздного любопытства твой код вряд ли кто-то станет компилировать и потом отлаживать за тебя.
Ну и второе угадаю... раз валиться на корне (видимо в винде) ты к буковке диска, наверно, забыл добавить + wxT("\\") прежде чем передать этот путь компилятору.
Posted: Thu Mar 26, 2009 8:51 am
by SmileGobo
Да вообще здорово, что хоть кто-то отвечает. Предпочитаю пользоваться отладочной печатью, и судя по ней валиться по выходу из функции, видимо что-то с потоками не так, может закрыть их не получается из-за не корректного пути.
В любом случае попробую слеш добавить в путь.
Posted: Thu Mar 26, 2009 8:59 am
by borr_1
Ты ведь прежде чем что-то с файликом делать проверяешь что он существует?
wxFile::Exists
static bool Exists(const char* filename)
Returns true if the given name specifies an existing regular file (not a directory or a link)
Posted: Thu Mar 26, 2009 9:33 am
by SmileGobo
Я использую потоки:
Code: Select all
wxString Zip::Unpack(const wxString& path,wxStatusBar& info){
wxZipEntry *entry;
for(int i=0;i<to_arhive.Count();i++){
wxFileInputStream in(to_arhive[i]);
wxZipInputStream zip(in);
//wxMessageBox(wxString::Format("%s%d_comment.txt",path,i));
//wxFileOutputStream(wxString::Format("%s%d_comment.txt",path,i));
int j=zip.GetTotalEntries();
while (j-->0){
static unsigned char buf[1024];
entry=zip.GetNextEntry(); //получить следующий вложенный файл
wxString name = entry->GetName(); //Получить имя
size_t byte_left=entry->GetSize(); //Получить размер
zip.OpenEntry(*entry);
wxFileOutputStream unpack_file(path+name);
while (byte_left > 0){
//wxMessageBox(wxString::Format("%d",byte_left));
size_t bytes_read=min((size_t) sizeof(buf),byte_left);
zip.Read((void*)buf,bytes_read);
unpack_file.Write((void*)buf,bytes_read);
//unpack_file.SeekO(0,wxFromEnd);
//Вычесть прочитанное
byte_left-=bytes_read;
}
}
}
}
wxArrayString to_arhive; //Хранит список имен файлов.
Posted: Thu Mar 26, 2009 10:51 pm
by SmileGobo
Вобщем от части догадка о добавлении к пути файла wxT("\\") оказалась верной. Помимо был косяк в не аккуратном использовании указателей и ссылок (пошел учить матчасть )
.
Posted: Fri Mar 27, 2009 12:38 am
by T-Rex
И кстати не wxT("\\"), а wxFILE_SEP_PATH
Posted: Fri Mar 27, 2009 5:38 am
by borr_1
Ну если на то пошло то и у wxFileInputStream есть с-во IsOK чтобы проверить загрузил поток что-то или нет.