Копирование и удаление файлов
От: irbis3003  
Дата: 01.10.10 06:21
Оценка:
В ходе программы проверяю существование директории, если она есть — удаляю, создаю такую же (то есть с таким же именем), и копирую в нее файлы из другой папки.
Вот в чем беда — иногда удаляет и копирует без проблем, но в определенный момент выдает ошибку "Не удается удалить файл. Не удается произвести чтение из файла..." и т.д.
В коде ни чего не меняю.
Почему может вываливать такая ошибка?

Вот код:

Удаление:
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;
 }

}

Создание:
bool iCreateDir(char *iNewDir)
{
    if (!IsDirExists(iNewDir))
    {
      CreateDirectoryA(iNewDir, NULL);
      return true;
    }
    else return false;
}

Копирование в папку:
bool CopyFiles(char *iFrom)
{    
  SHFILEOPSTRUCT TEST;
  //TEST.hwnd=0;
  TEST.pFrom=iFrom;
  TEST.pTo="C:\\New_Way";
  TEST.wFunc=FO_COPY;
  TEST.fFlags=FOF_NOCONFIRMATION;
  if (SHFileOperationA(&TEST)!=0) return false;
  else return true;
}

Ну и последовательность вызова:

    DelDir("C:\\New_Way"); // - если директория существует - удаляем ее
       if (iCreateDir("C:\\New_Way"))
       {
         if(CopyFiles("C:\\Way\\*.*")) //
         {
           MessageBox(NULL, "Copy", "Complete", 0);
                 }
       }


Иногда просто не копирует.
Подскажите че-нить.
(сразу скажу — не предлагайте функции, работающие через AnsiString)
Re: Копирование и удаление файлов
От: Сергей Мухин Россия  
Дата: 01.10.10 06:48
Оценка:
Здравствуйте, irbis3003, Вы писали:

I>В ходе программы проверяю существование директории, если она есть — удаляю, создаю такую же (то есть с таким же именем), и копирую в нее файлы из другой папки.

I>Вот в чем беда — иногда удаляет и копирует без проблем, но в определенный момент выдает ошибку "Не удается удалить файл. Не удается произвести чтение из файла..." и т.д.

I>Иногда просто не копирует.

I>Подскажите че-нить.
I>(сразу скажу — не предлагайте функции, работающие через AnsiString)


1. форматировать надо тегом ccode а не code
2. проверять существование лучше GetFileAttributes (формально ты можешь иметь право создать файл, но не иметь права удалять оглавление)
3. зачем удалять и сразу создавать? для очистки?
4. может лучше будет переименовать, потом удалить, потом создавать?
---
С уважением,
Сергей Мухин
Re[2]: Копирование и удаление файлов
От: irbis3003  
Дата: 01.10.10 07:11
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>1. форматировать надо тегом ccode а не code

СМ>2. проверять существование лучше GetFileAttributes (формально ты можешь иметь право создать файл, но не иметь права удалять оглавление)
СМ>3. зачем удалять и сразу создавать? для очистки?
СМ>4. может лучше будет переименовать, потом удалить, потом создавать?

зачем выполнять операцию по переименованию? это мне кажется лишним.
а за GetFileAttributes спасибо — попробую.
удалять и создавать именно для очистки. т.е. в ходе работы программы будет одна временная папка, которая должны удалиться по завершению всех операций.
если это по какой-либо причине не произошло, стираем эту папку и создаем новую.
Re[3]: Копирование и удаление файлов
От: Сергей Мухин Россия  
Дата: 01.10.10 07:12
Оценка:
Здравствуйте, irbis3003, Вы писали:

I>зачем выполнять операцию по переименованию? это мне кажется лишним.

а Вы попробуйте. Переименовать быстрее.
---
С уважением,
Сергей Мухин
Re[4]: Копирование и удаление файлов
От: irbis3003  
Дата: 01.10.10 07:35
Оценка:
странно, но пока все работает и со старым кодом.
буду ждать пока ошибки снова появятся
Re[4]: Копирование и удаление файлов
От: irbis3003  
Дата: 01.10.10 09:04
Оценка:
разобрался вроде.
в какой-то момент параметр пути передавал с эдита приложения. по незнанию скопировал туда путь с программы, в котором, естественно, были двойные "\\".
Теперь убрал их, и все действительно работает.
Re: Копирование и удаление файлов
От: KursantPupkin Россия  
Дата: 01.10.10 09:58
Оценка:
Здравствуйте, irbis3003, Вы писали:

I>bool IsDirExists(char *checkDir)


Зачем велосипед, чем функция PathIsDirectory не устраивает?
Re[3]: Копирование и удаление файлов
От: Erop Россия  
Дата: 01.10.10 18:32
Оценка:
Здравствуйте, irbis3003, Вы писали:

I>зачем выполнять операцию по переименованию? это мне кажется лишним.

Ну для транзакционности, например. Типа либо останется нетронутая папка, либо сразу исчезнет, а появится переименованная, возможно недотёртая.

Но можно ещё дальше пойти! Я так понял, что эта папка -- папка, для временных файлов?
Можно для каждой задачи/запуска программы/ещё чего-то такого, генерить папку с уникальным именем, потом там работать, потом тереть.
Преимущество -- каждый раз работаем гарантированно в чистой папке...

Да, для генерации уникальных имен папок удобно юзать генерилку UID'ов
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Копирование и удаление файлов
От: Сергей Мухин Россия  
Дата: 01.10.10 19:30
Оценка:
Здравствуйте, Erop, Вы писали:

E>Да, для генерации уникальных имен папок удобно юзать генерилку UID'ов


1. может быть можно и GetTempFileName, для директории не уверен
2. если файлы открывать с флажком FILE_FLAG_DELETE_ON_CLOSE (если можно) то меньше вероятность, что они останутся. И значит меньше чистить
---
С уважением,
Сергей Мухин
Re[4]: Копирование и удаление файлов
От: irbis3003  
Дата: 02.10.10 06:22
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, irbis3003, Вы писали:


I>>зачем выполнять операцию по переименованию? это мне кажется лишним.

E>Ну для транзакционности, например. Типа либо останется нетронутая папка, либо сразу исчезнет, а появится переименованная, возможно недотёртая.

E>Но можно ещё дальше пойти! Я так понял, что эта папка -- папка, для временных файлов?

E>Можно для каждой задачи/запуска программы/ещё чего-то такого, генерить папку с уникальным именем, потом там работать, потом тереть.
E>Преимущество -- каждый раз работаем гарантированно в чистой папке...

E>Да, для генерации уникальных имен папок удобно юзать генерилку UID'ов


пасиб за совет)
но папку я по привычке темп назвал. А для уникальности имени еще можно время создания задавать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.