Скопируйте папку Delphi с файлами

Обновлено: 21.11.2024

Я пытаюсь сделать что-то довольно простое. Мне просто нужно скопировать папку
вместе со всем ее содержимым в другое место. К сожалению,
единственный способ, которым я могу это сделать, — это какая-то огромная рекурсивная процедура. Разве нет
простой команды Delphi для копирования/перемещения папки с содержимым?

Или, в противном случае, есть простой и чистый рекурсивный скрипт, который я могу
использовать для копирования папки и файлов?


Я только что попробовал SHFileOperation и тоже не могу заставить его работать. Есть ли
некоторая проблема с моим кодом? Структура папки назначения
еще не существует, когда я запускаю этот код, не знаю, является ли это фактором или нет.

Цитата
Цитата
> Я пытаюсь сделать что-то довольно простое. Мне просто нужно скопировать папку
> вместе со всем ее содержимым в другое место. К сожалению, единственный
> способ, которым я могу это сделать, — это какая-то огромная рекурсивная процедура. Разве нет
> простой команды Delphi для копирования/перемещения папки с содержимым?

> Или, в противном случае, есть простой и чистый рекурсивный скрипт, который я могу
> использовать для копирования папки и файлов?

> - Дэн


К сожалению, если вы посмотрите на сообщение, которое я ответил самому себе, оно показывает, как я
пробовал SHFileOperation и не могу заставить его работать. Это простой код, но папки не копируются. Я получаю сообщение об ошибке, что файл не может быть найден.
Что не имеет смысла, так как я копирую папку.

Цитата
Цитата
> Дэн писал:
>> Я пытаюсь сделать что-то довольно простое. Мне просто нужно скопировать папку
>> вместе со всем ее содержимым в другое место.

> Вы думаете, что это будет просто, не так ли? Но хотите ли вы также скопировать
> права доступа к файлам? Что делать, если разрешения несовместимы с
> разрешениями в папке назначения? Что делать, если файл
> зашифрован? Если одна из папок является жесткой ссылкой, следует ли продублировать ссылку
> или создать новую копию папки, на которую указывает ссылка? Каковы должны быть даты новых
> файлов?

>> К сожалению, единственный способ, который я могу найти, это какая-то огромная рекурсивная
>> процедура. Разве нет простой команды Delphi для копирования/перемещения папки с содержимым
>>?

> ShFileOperation может копировать файлы и папки так же, как если бы вы перетаскивали
> и опускали их в проводнике Windows. Ответы проводника на вопросы
> выше могут не соответствовать вашим ожиданиям.

>> Или, если это не так, есть простой и чистый рекурсивный скрипт, который я могу
>> использовать для копирования папки и файлов?

> Похоже, он у вас уже есть.

> --
> Ограбить

Цитата

Дэн написал:
> Я только что попробовал SHFileOperation и тоже не могу заставить его работать.

Нужно уточнить. Что в нем не работает? Можете ли вы скомпилировать его?
Вы можете запустить его? Когда вы запускаете его, что происходит? Что вы ожидали
произойти вместо этого?

Цитата

> Есть ли
> какая-то проблема с моим кодом? Структура папки назначения
> еще не существует, когда я запускаю этот код, не знаю, является ли это фактором или
> нет.

Проверьте свою функцию, когда папка назначения _существует_, и тогда
вы узнаете, является ли это фактором.

Цитата
Цитата

> С OpStruct Выполнить
> Начать
> Wnd:=0;
> wFunc:=FO_COPY;
> pFrom:= @FromDir[1];
> pTo:= @Destination[1];

Указывают ли эти строки полные пути? Документация
рекомендует это.

Цитата

> fFlags:=FOF_ALLOWUNDO или FOF_SILENT или FOF_NOCONFIRMATION;

Цитата

> Конец;
> если нет DirectoryExists(Destination), то ForceDirectories(Destination);

Я почти уверен, что ForceDirectories уже включает вызов
DirectoryExists; вам не нужно называть это самостоятельно.

Цитата
Цитата
Цитата

Дэн написал:
> Я пытаюсь сделать что-то довольно простое. Мне просто нужно скопировать папку
> вместе со всем ее содержимым в другое место.

Вы думаете, что это будет просто, не так ли? Но хотите ли вы также скопировать
права доступа к файлам? Что делать, если разрешения
несовместимы с разрешениями в папке назначения? Что делать, если файл
зашифрован? Если одна из папок является жесткой ссылкой, следует ли продублировать
ссылку или создать новую копию папки, на которую указывает ссылка? Какими должны быть даты
новых файлов?

Цитата

> К сожалению,
> единственный способ, который я могу найти, это какая-то огромная рекурсивная процедура. Разве
> нет простой команды Delphi для копирования/перемещения папки с содержимым?

ShFileOperation может копировать файлы и папки так же, как если бы вы
перетаскивали их в проводнике Windows. Ответы Explorer на
вопросы выше могут не соответствовать вашим ожиданиям.

Цитата

> Или, в противном случае, есть простой и чистый рекурсивный скрипт, который я
> могу использовать для копирования папки и файлов?

Цитата

Дэн написал:
> К сожалению, если вы посмотрите на сообщение, которое я ответил самому себе, вы увидите,
> как я пробовал SHFileOperation и не могу заставить его работать. Это простой
> код, но папки не копируются. Я получаю сообщение об ошибке, что файл может
> не быть найден. Что не имеет смысла, поскольку я копирую папку.

Цитата

> Вам нужно уточнить. Что в нем не работает? Можете ли вы скомпилировать его? Можешь
> запустить? Когда вы запускаете его, что происходит? Что вы ожидали
> вместо этого?

Он компилируется нормально, когда я запускаю код, он работает нормально и пытается скопировать. Функция
SHFileOperation возвращает целое число, равное 2. Однако я не совсем уверен,
какой код ошибки соответствует этому коду.

Цитата

> Проверьте свою функцию, когда папка назначения _существует_, и тогда
> вы узнаете, является ли это фактором.

Я изменил код на:

Цитата

> В этих строках указываются полные пути? Документация
> рекомендует это.

Цитата
>> fFlags:=FOF_ALLOWUNDO или FOF_SILENT или FOF_NOCONFIRMATION;

> TShFileOpStruct состоит из восьми элементов, но вы затрагиваете только пять из них. Что
> с остальными тремя?

Цитата
Цитата
>> В этих строках указываются полные пути? Документация
>> рекомендует это.

> Да, это точный путь, например. C:\Documents и .

Цитата
Иэн Макмиллан написал:
> В статье "Дэн"
> написал:

>>> Указывают ли эти строки полные пути? Документация
>>> рекомендует это.
>> Да, это точный путь, например. C:\Документы и .

> Если в пути есть пробелы, не должно ли это быть:

> "C:\Documents and . "

Не понимаю, почему. Кавычки предназначены для экранирования обработки командной строки.
API уже знает, что получает одно имя файла для каждого элемента списка.

Цитата
Цитата
> Я пытаюсь сделать что-то довольно простое. Мне просто нужно скопировать папку
> вместе со всем ее содержимым в другое место. К сожалению, единственный
> способ, которым я могу это сделать, — это какая-то огромная рекурсивная процедура. Разве нет
> простой команды Delphi для копирования/перемещения папки с содержимым?

> Или, в противном случае, есть простой и чистый рекурсивный скрипт, который я могу
> использовать для копирования папки и файлов?

> - Дэн

Привет, Дэн!
Прошло некоторое время с тех пор, как я написал/использовал эту процедуру - SHFileOperation
очень суетлива в отношении нулевых терминаторов и ее TShFileOpStruct . получить что-нибудь
неправильное, и он либо молча терпит неудачу, либо работает, но не так, как ожидалось или хотелось.

Брэдли

embarcadero.delphi.nativeapi 1236 статей. 1 подписчик. Подписаться

17 ответов
5130 просмотров

Ангус

Ангус

Брэдли

Утф

Харри

Кен

Харри

Кен

Харри

Кен

Харри

Уэйн

Харри

Уэйн

Харри

Кен

Харри

Похожие статьи:

Копирование всех файлов в каталоге с помощью file.copy или directory.copy между томами
Мне нужно скопировать все файлы из каталога компакт-диска в каталог на моем жестком диске. Я попробовал метод directory.copy, но он не позволит мне копировать тома. Я попробовал метод file.copy, но вы должны указать имя файла в пути, а также цель. Это противоречит цели того, что я пытаюсь сделать. По сути, я использую переключатель, чтобы указать тип компакт-диска, и на основе этого выбора приложение знает, в каком каталоге искать нужные мне файлы. Вот сценарий, который я пробовал в последний раз для перемещения файла. Sub KPacs(ByVal sender As Object, ByVal e As System.EventA.

Пакетный файл для копирования файлов в определенный каталог
Здравствуйте! Был бы очень признателен, если бы кто-нибудь мог дать мне ключ к следующей проблеме. Окружение выглядит следующим образом. Сервер Netware 5.1 и настольный ПК с Windows 2000 и Word 2000. Я экспериментирую с пакетными файлами, чтобы перейти в определенный каталог, а затем скопировать туда файл. Когда я набираю SET для отображения переменных среды, среди прочего отображается следующее: APPDATA=C:\Documents and Settings\BOBC\Application Data NWUSERNAME=BOBC USERNAME=BOBC Я попробовал следующую пакетную команду из сценария входа пользователя, чтобы перейти к c:\Документ и настройки.

Delphi 2009
Я использую Delphi 2009 с установленным обновлением 1 под Windows XP с установленным пакетом обновления 3. Файлы .bpi и .lib моего пакета Delphi 2009 всегда создаются в том же каталоге, где находится мой .dproj. Есть ли вариант проекта, который позволит мне поместить эти файлы .bpi и .lib в другой каталог? Ларри Гриффитс Калос Инк.

File::Copy::copy() умирает на идентичных файлах?
Я немного изменил тесты File::Copy и наткнулся на это: eval < copy("copy- $$", "копировать-$$") >; printf "ok %d\n", 15+$loopconst, если только $@ =~ /не идентичны/ && -s "copy-$$"; который в основном говорит: «copy() должен умереть, если ему предоставлен один и тот же исходный и конечный файл», что немного экстремально. Предупредить возможно, но не умереть. Я думаю, что это просто повторяет поведение команды оболочки «cp». Если ни у кого нет возражений, я понизлю это до предупреждения, и copy() просто завершится успешно. П.

File.Copy не снимает блокировку скопированного файла.
Привет! Я пытаюсь использовать функцию File.Copy, чтобы скопировать файл с ПК клиента на сервер. Копируемый файл выбирается пользователем с помощью элемента управления FileUpload, а затем используется сервером для выполнения определенных операций. Моя проблема в том, что когда я копирую файл с помощью метода File.Copy, а затем сразу после этого запускаю процесс потокового чтения в файле, я получаю следующую ошибку: "Процесс не может получить доступ к файлу "\\syddev1\latest\xmasEmail.html", поскольку он используется другим процессом". Ниже приведен фрагмент кода, в котором возникла проблема.

Копирование более одного файла с помощью File::Copy
Добрый день=3B Заранее извиняюсь, если это очень глупый вопрос=85 I=27m пытаюсь объединить два файла и записать результаты в a = третий файл = 2E = Возможно, я = 27m пропустил что-то очевидное = 2E = 2E = 2E, но в Perldoc для файла = 3A = = 3ACopy I = чтение = 3A = 22 Функция копирования принимает два параметра = 3A файл для копирования = и = файл для копирования=2E=22 Что делать, если у меня есть второй файл, из которого я хочу скопировать=3F (i=2Ee=2E Li= ke = команда копирования DOS=3A c=3A=5C file1=2Etxt + file2=2Etxt file3=2Etxt скопирует = содержимое файла file1=2Etxt =26 file2=2Etxt и поместит его.

копирование файла без использования модуля File::Copy
Привет всем! Единственный способ скопировать файл из одного каталога в другой с помощью модуля копирования. У кого-нибудь есть фрагмент кода, копирующий файл из одного каталога в другой. Любая помощь будет оценена. Спасибо, Майк ------------------------------------------------------------- -- В пятницу, 14 февраля 2003 г. 10:13:06 -0500, Майкл Пасторе написал: > > Всем привет, > > Это единственный способ скопировать файл из одного каталога в другой с помощью > модуля копирования. > > Может у кого-нибудь есть фрагмент кода, копирующий f.

Проблемы с методом File.Copy() для копирования больших файлов
Я использую следующую команду для копирования файла: source = "c:\\domains\\pagina.com.br\\wwwroot\ \folder\\filesou.xml";target = "c:\\domains\\pagina.com.br\\wwwroot\\folder\\filetar.xmb"; File.Copy(источник, цель, правда); Если бы я использовал небольшой файл (источник), например, 233000 байт, сервер без проблем скопировал бы его в цель. Но если я использовал файл (исходник) размером 700000 байт, сервер не копировал. Я копирую в ту же папку. Почему это произошло с большим файлом в качестве источника? Спасибо. Роджерио Выдает какую-нибудь ошибку. HighOnCodingХочу получить кайф! Я не знаю, выдает ли это какую-либо ошибку. Хо.

Файлы как в каталоге, так и не в каталоге
Я столкнулся с очень странной ситуацией/проблемой. Если файлы копируются с помощью команды копирования MS следующим образом: copy g:\testfile.txt "i:\archive\", команда сообщает, что файл скопирован. При использовании любого файлового браузера в Windows или на сервере файл не отображается в списке каталогов. Однако, если вы попытаетесь создать файл с тем же именем в целевом каталоге, он скажет вам, что это невозможно, потому что файл с таким именем уже существует. Я не знаю, для чего нужны кавычки в команде копирования. Это было из пакетного файла, который настроил кто-то другой. Это работает как ни.

переопределить файл при копировании в каталог
Привет! Я копирую файл из одной папки в другую и хотел бы перезаписать его, если соответствующий файл уже существует в папке назначения: FileInfo fileData = new FileInfo(MapPath("~/Clients/" + strPage + "/" + "Данные.xml")); fileData.CopyTo(MapPath("~/Clients/" + strPage + "/" + "ViewRessources" + "/" + "Data.xml")); Я получаю сообщение об ошибке в этом коде, что файл data.xml уже существует. Вы можете использовать .Move() из System.IO.File, чтобы справиться с этим за вас, но лучшим предложением будет проверка с помощью a.

Каталоги создаются, но файлы не копируются
Я некоторое время работал над этим скриптом и надеюсь, что смогу взглянуть на него свежим взглядом. Я создаю список, а затем использую список для создания каталогов. После создания каталогов я хотел бы рекурсивно переместить файлы в каталоги, из которых они исходят (это установка приложения cd для сервера). У нас есть каталоги для создания, а затем файлы будут скопированы в базовый каталог (C:\junk\save\, поэтому мы подумали, что это проблема времени, поэтому мы переместили часть каталога сборки в другой скрипт, вызываемый первым и ни один из теперь они работают. Джон Хер.

Проблема Копирование файла с удаленного клиента с помощью File.Copy
Здравствуйте, мне нужно скопировать файл, загруженный с удаленного клиента на веб-сервер, в папку моего приложения. Для этого я использую следующую логику. File.Copy(srcPath, destPath) Где srcPath = путь, выбранный пользователем с помощью элемента управления вводом файлов HTML. и destPath = Server.MapPath(Excel_Upload) + "\Sample.xls" Это отлично работает, когда я пытаюсь загрузить файл с серверной системы, но когда я пытаюсь сделать то же самое с удаленного клиента, я получаю исключение, которое говорит: "Файл. Копировать Не удалось найти часть пути «C:\Documents and Settings\Anas\Desktop\Sample12.xls»&.

Копирование файлов в Windows из одного каталога в другой
------=_Part_7841_20718407.1152726226112 Content-Type: text/plain; кодировка = ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Привет, у меня есть несколько файлов в $BNY_DOWNLOAD, который является каталогом в Windows. Теперь мне нужно определить самый последний файл в этом файле и переместить его в каталог $BNY_DATA, который также является каталогом. Чтобы определить самый последний файл, я использовал команду sort и отсортировал его с помощью операторов -M и и космического корабля. Он возвращает список файлов в этом каталоге, отсортированных по последнему порядку модификации. Я получаю это самое последнее.

Необходимо: программа для копирования всех файлов, соответствующих маске файла, в другую папку.

Предыстория и методы

Недавно мне понадобилась процедура для копирования всех файлов из папки на компакт-диске в новую папку на жестком диске и сброса атрибутов «Только для чтения». .

Эта программа была написана для тестирования полученной новой функции "CopyFolder", но кажется, что программа имеет достаточно функций, чтобы, возможно, служить полезной утилитой для непрограммистов..

Использование простое: выберите входную папку и выходную папку. Выходная папка может быть существующей или новой. Другие варианты включают:

Нажмите кнопку «Копировать», чтобы завершить операцию. После завершения операции отобразится список скопированных файлов и их общее количество.

Вы можете прервать операцию, нажав кнопку "Стоп", но копии уже обработанных файлов останутся в выходной папке. Если вы выберете опцию «Спросить» для группы переключателей «Дубликаты файлов», ответ «Отмена» на запрос также остановит операцию.

Непрограммисты могут читать дальше, но могут захотеть перейти к нижней части этой страницы, чтобы загрузить исполняемую версию программы.

Примечания для программистов

Программа вызывает функцию "CopyFolder", содержащуюся в модуле UCopyFolder.pas, для выполнения большей части работы. CopyFolder копирует файлы, соответствующие заданной маске, из одной папки в другую. Параметры:

FileExit должен возвращать значение true, если копирование должно быть продолжено, и false, чтобы прервать процедуру копирования без копирования дополнительных файлов.

CopyFolder использует несколько методов, которые стоит описать для дальнейшего использования

Рекурсивный поиск по папке и подпапки — это метод, который мы использовали ранее, но фильтрация файлов по маске файла немного усложняет процедуру. Функция FindFirst может фильтровать возвращаемые записи на основе указанной маски файла, но, поскольку мы, вероятно, будем рекурсивно вызывать CopyFolder с подкаталогами входного каталога, FindFirst должен искать все имена файлов (с маской имени файла "*.*")< /td>
Сопоставление маски файла — FindFirst и последующие вызовы FindNext извлекают информацию о файле в TSearchrec для каждого вызова, включая имя файла, дату, атрибуты . Поле Name передается в функцию MatchesMask вместе с маской, указанной пользователем. Я не смог найти ориентированного на пользователя описания строк маски, поэтому добавил в программу вкладку с описанием полей маски и несколькими примерами.
Перегрузка функции или процедуры с необязательным вызовом метода. Я решил предоставить необязательную функцию обратного вызова, передаваемую в качестве параметра в CopyFolder. Функция обратного вызова вызывается для каждого копируемого файла с передачей параметров, описанных выше. Типичный способ сделать параметр необязательным — предоставить перегруженную версию без дополнительного параметра и оттуда вызвать «настоящую» версию со значением по умолчанию для отсутствующего параметра. (Delphi распознает ключевое слово «перегрузка» в определении процедуры и будет принимать несколько определений с одним и тем же именем, если списки параметров различаются.) Хитрость здесь заключается в том, что мы не можем передать значение «Nil» (без адреса) для функция обратного вызова, потому что функция определена как функция типа метода «объекта», что означает, что это метод объекта. Функции типа метода передаются как пара указателей, указатель на код функции и указатель на экземпляр класса, которому он принадлежит. Я решил проблему, определив функцию DummyFileExit в определении TDummyClass. И экземпляр TDummyClass с именем DummyClass. Этот DummyfFileExit теперь может быть передан как FileExit по умолчанию для случаев, когда пользователь решил не предоставлять его. CopyFile проверяет и игнорирует любую ссылку на DummyFileExit, поэтому нет необходимости фактически создавать экземпляр DummyClass. Ух ты!
Изменение атрибутов файла. Я нашел единственный способ сбросить атрибут ReadOnly, скопировав (используя Windows CopyFile), а затем используйте функцию SetFileAttr для сброса атрибута, если он был установлен во входных данных.

Дополнение от 10 ноября 2008 г.: По запросу пользователя в версию 2 теста копирования папок был добавлен новый параметр. Теперь можно игнорировать файлы структуры папок из подпапок выбранной входной папки и копировать все файлы непосредственно в выбранную выходную папку. Кроме того, счетчики скопированных файлов,
перезаписанных дубликатов файлов и нескопированных дубликатов файлов сохраняются функциями копирования папок и сообщаются этой программой во время завершения задания.Последний новый параметр добавляет кнопки «Да для всех» и «Нет для всех» в диалоговое окно «Спросить», чтобы указать действие по умолчанию, которое будет выполняться при обнаружении дополнительных повторяющихся имен файлов.

4 декабря 2008 г.: Версия 3 изменяет проверку даты файла для решения о перезаписи, чтобы использовать «Дату последнего изменения» вместо «Дата создания». Кажется, это имеет больше смысла, как предложил пользователь. Я также исправил ошибку, из-за которой программа пыталась скопировать папку назначения, которая оказалась подпапкой исходной папки — не очень хорошая идея, так как это будет зацикливаться навсегда или, по крайней мере, до тех пор, пока диск не заполнится!

15 июля 2012 г.: сегодня была опубликована версия 3.1 с тремя улучшениями:

Возможность обработки файлов без фактически их копирование было добавлено. Это необходимо для определения общего количества и размера заархивированных файлов здесь, в DFF.
Каталоги с атрибутом "Система" теперь включены в список каталогов, чтобы их можно было выбрать. Папки «Веб-сайт» являются одним из примеров типов, которые ранее нельзя было выбрать. Для исправления требовалось исправить «оплошность» в модуле Delphi 7 FileCtrl, из-за которой класс TDirectoryListBox исключал эти каталоги. Модифицированный модуль FileCtrl включен в исходный код для загрузки.
Изменение, позволяющее корректно сообщать о размерах файлов, превышающих 4 ГБ, которые ранее включались в наша служебная программа List Large Files теперь включена сюда.

11 мая 2013 г.: В исходной программе я предусмотрел выполнение таких операций, как копирование всех файлов из папки «ProgramA» в новую папку «ProgrtamA_Test». Зритель указал, что это не сработало для его предполагаемого использования: т. Е. Копировать папки «ProgramA», «ProgramB» и «ProgramC» в папку с именем «Резервные копии». Другими словами, скопируйте имя папки, а также файлы в этой папке. Мне это показалось разумным, поэтому в опубликованной сегодня версии 3.2 добавлен флажок: «Включить выбранную запись входной папки в выходную», чтобы сделать именно это.

Запуск/Изучение программы

Предложения по дальнейшему изучению

Есть ли более прямой способ сделать указатель метода необязательным параметром в вызове функции?

Читайте также: