В ходе программы проверяю существование директории, если она есть — удаляю, создаю такую же (то есть с таким же именем), и копирую в нее файлы из другой папки.
Вот в чем беда — иногда удаляет и копирует без проблем, но в определенный момент выдает ошибку "Не удается удалить файл. Не удается произвести чтение из файла..." и т.д.
В коде ни чего не меняю.
Почему может вываливать такая ошибка?
Вот код:
Удаление:
bool IsDirExists(char *checkDir)
{ //проверяем существование директории через возврат ошибки на создание файла в данной дериктории
HANDLE Handle = CreateFile(checkDir,
0,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
INVALID_HANDLE_VALUE);
if(Handle == INVALID_HANDLE_VALUE)
return false;
CloseHandle(Handle);
return true;
}
//---------------------------------------------------------------------------
bool DelDir(char *iDie)
{
if (IsDirExists(iDie)) {
SHFILEOPSTRUCT fo;
ZeroMemory(&fo, sizeof(fo));
fo.pFrom = iDie;
fo.wFunc = FO_DELETE;
fo.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
if (SHFileOperationA(&fo) == 0)
{
return true;
} else return false;
}
}
Здравствуйте, irbis3003, Вы писали:
I>В ходе программы проверяю существование директории, если она есть — удаляю, создаю такую же (то есть с таким же именем), и копирую в нее файлы из другой папки. I>Вот в чем беда — иногда удаляет и копирует без проблем, но в определенный момент выдает ошибку "Не удается удалить файл. Не удается произвести чтение из файла..." и т.д.
I>Иногда просто не копирует. I>Подскажите че-нить. I>(сразу скажу — не предлагайте функции, работающие через AnsiString)
1. форматировать надо тегом ccode а не code
2. проверять существование лучше GetFileAttributes (формально ты можешь иметь право создать файл, но не иметь права удалять оглавление)
3. зачем удалять и сразу создавать? для очистки?
4. может лучше будет переименовать, потом удалить, потом создавать?
Здравствуйте, Сергей Мухин, Вы писали:
СМ>1. форматировать надо тегом ccode а не code СМ>2. проверять существование лучше GetFileAttributes (формально ты можешь иметь право создать файл, но не иметь права удалять оглавление) СМ>3. зачем удалять и сразу создавать? для очистки? СМ>4. может лучше будет переименовать, потом удалить, потом создавать?
зачем выполнять операцию по переименованию? это мне кажется лишним.
а за GetFileAttributes спасибо — попробую.
удалять и создавать именно для очистки. т.е. в ходе работы программы будет одна временная папка, которая должны удалиться по завершению всех операций.
если это по какой-либо причине не произошло, стираем эту папку и создаем новую.
разобрался вроде.
в какой-то момент параметр пути передавал с эдита приложения. по незнанию скопировал туда путь с программы, в котором, естественно, были двойные "\\".
Теперь убрал их, и все действительно работает.
Здравствуйте, irbis3003, Вы писали:
I>зачем выполнять операцию по переименованию? это мне кажется лишним.
Ну для транзакционности, например. Типа либо останется нетронутая папка, либо сразу исчезнет, а появится переименованная, возможно недотёртая.
Но можно ещё дальше пойти! Я так понял, что эта папка -- папка, для временных файлов?
Можно для каждой задачи/запуска программы/ещё чего-то такого, генерить папку с уникальным именем, потом там работать, потом тереть.
Преимущество -- каждый раз работаем гарантированно в чистой папке...
Да, для генерации уникальных имен папок удобно юзать генерилку UID'ов
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Да, для генерации уникальных имен папок удобно юзать генерилку UID'ов
1. может быть можно и GetTempFileName, для директории не уверен
2. если файлы открывать с флажком FILE_FLAG_DELETE_ON_CLOSE (если можно) то меньше вероятность, что они останутся. И значит меньше чистить
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, irbis3003, Вы писали:
I>>зачем выполнять операцию по переименованию? это мне кажется лишним. E>Ну для транзакционности, например. Типа либо останется нетронутая папка, либо сразу исчезнет, а появится переименованная, возможно недотёртая.
E>Но можно ещё дальше пойти! Я так понял, что эта папка -- папка, для временных файлов? E>Можно для каждой задачи/запуска программы/ещё чего-то такого, генерить папку с уникальным именем, потом там работать, потом тереть. E>Преимущество -- каждый раз работаем гарантированно в чистой папке...
E>Да, для генерации уникальных имен папок удобно юзать генерилку UID'ов
пасиб за совет)
но папку я по привычке темп назвал. А для уникальности имени еще можно время создания задавать.