Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.05.2017, 20:03
Eldar1991 Eldar1991 вне форума
Прохожий
 
Регистрация: 02.03.2015
Сообщения: 21
Версия Delphi: delphi7
Репутация: 10
По умолчанию Ошибка пути при переносе файлов

Здравствуйте!
Такой вопрос:
Использую данную функцию для перемещения каталогов с файлами:
Код:
function MoveDir(fromDir, toDir: String): Boolean;   // функция перемещения файлов
var
fos: TSHFileOpStruct;
toDir2: string;
begin
toDir2 :=toDir;
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_MOVE;
//fFlags := FOF_FILESONLY;
fFlags:= FOF_SIMPLEPROGRESS;
fflags:= fflags or FOF_NOCONFIRMATION;
fflags:= fflags or FOF_SILENT;
pFrom := PChar(fromDir + #0);
pTo := PChar(toDir2);
end;
Result := (0 = ShFileOperation(fos));
end;
Программа в цикле обращается к папке и переносит оттуда нужные каталоги. В штатном режиме все работает хорошо, но часто возникает ситуация, что в момент переноса каталога в него происходит "запись" новых файлов из другого источника. В таком случае конечный путь перемещения дублируется на одну папку. Иными словами при переносе в директорию C:\Folder\, первый переносимый файл каталога остается в нем, а последующие уже создаются в C:\Folder\Folder\. Как грамотно исправить эту проблему?
Ответить с цитированием
  #2  
Старый 03.05.2017, 21:15
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Как не извращался, ситуацию повторить не удалось, папка успевает успешно "улететь" в нужную директорию до копирования в неё новых файлов, но возможно здесь не хватает принудительной установки текущей папки посредством SetCurrentDirectory
Код:
...
ZeroMemory(@fos, SizeOf(fos));
SetCurrentDirectory(PChar(toDir2));
...
а узнать её можно через вызов GetCurrentDirectory
Ответить с цитированием
  #3  
Старый 03.05.2017, 22:05
Eldar1991 Eldar1991 вне форума
Прохожий
 
Регистрация: 02.03.2015
Сообщения: 21
Версия Delphi: delphi7
Репутация: 10
По умолчанию

Спасибо большое Вам за ответ, да действительно ситуация немного нестандартная, я думал поставить что то типа directoryexist, но не знаю как правильно это оформить. как попробую тогда отпишусь.
Ответить с цитированием
  #4  
Старый 04.05.2017, 05:52
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Eldar1991
...ситуация немного нестандартная
Что-то подобное когда-то у нас здесь уже было
Ответить с цитированием
  #5  
Старый 04.05.2017, 15:58
Eldar1991 Eldar1991 вне форума
Прохожий
 
Регистрация: 02.03.2015
Сообщения: 21
Версия Delphi: delphi7
Репутация: 10
По умолчанию

Попробовал изменить адресацию и добился.... теперь и вовсе при повторном переносе если в конечной папке такое имя каталога есть он 100% создает в нем еще одну папку. реализовано вот так.
Код:
for i:=0 to memo2.lines.count-1 do
   if (memo2.Text<>'') and (combobox1.Text<>'') then
    begin
    try
      if checkbox8.Checked=false then
        MoveDir(combobox1.Text+memo2.Lines[i], ExtractFileDir(Application.ExeName)+'\tails\'+memo2.Lines[i])
      else
      MoveDir(combobox1.Text+memo2.Lines[i], edit3.text+'\tails\'+memo2.Lines[i]);
    except
    end;
может можно как то условие проверки на наличие папки сделать, только что тогда делать если например существующая папка будет обнаружена.
Ответить с цитированием
  #6  
Старый 04.05.2017, 16:04
Eldar1991 Eldar1991 вне форума
Прохожий
 
Регистрация: 02.03.2015
Сообщения: 21
Версия Delphi: delphi7
Репутация: 10
По умолчанию

где то очевидная ошибка... помогите ее увидеть
Ответить с цитированием
  #7  
Старый 04.05.2017, 18:55
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Я так понимаю, пока папка сносится на новое место, она тут же возрождается из другого процесса - тогда возможно в цикле следует убедиться в переносе предыдущей перед следующей итерацией (if MoveDir() then...) Не удалось добиться такой ситуации, хоть и копировалось в "феникса" несколько сот рандомных *.тхт файлов, они тут же улетали в нужном направлении, без дополнительных вложенных папок
Ответить с цитированием
  #8  
Старый 04.05.2017, 23:53
Eldar1991 Eldar1991 вне форума
Прохожий
 
Регистрация: 02.03.2015
Сообщения: 21
Версия Delphi: delphi7
Репутация: 10
По умолчанию

Конкретно мой изложенный код в данный момент, (у меня по крайней мере),гнусно "косячит" и проверяется очень просто: из папки А в папку Б указанным выше способом произвожу перенос папки С. Грубо говоря, было ...А\С стало ...Б\С. Все пока что хорошо. В папке А снова ручками создаю папку С и повторяю сие чудесное действие с переносом. И вуаля, фокус удался! Было ...А\С стало Б\С\С. И вот вторая папка С уже становится последним пристанищем всех вновь прибывающих файлов папок итд. (Хорошо хоть так)
уже задумываюсь писать отдельную софтинку чтобы поправляла эту беду в конечном каталоге, но мне кажется это глупо. Истина где то рядом...пробовал другие функции и процедуры по перемещению они не подходят поэтому и зацепился за эту...
Ответить с цитированием
  #9  
Старый 04.05.2017, 23:59
Eldar1991 Eldar1991 вне форума
Прохожий
 
Регистрация: 02.03.2015
Сообщения: 21
Версия Delphi: delphi7
Репутация: 10
По умолчанию

Пробовал кстати через CurrentDirectory так там все еще интереснее вышло. было А\С стало В\С\В\С причем каждое последующее копирование увеличивало эту цепочку...
Ответить с цитированием
  #10  
Старый 05.05.2017, 00:29
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вроде дошло, я перемещаю папку немного по-другому, если по предложенной вами схеме, то примерно так
Код:
...
if MoveDir('c:\a\c\','c:\b\') then
...
в смысле, в папке b появляется c единственная
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter