Delphi переместить все файлы
В данной статье мы подробно рассмотрим применение функции SHFileOperation.
Данная функция позволяет производить копирование, перемещение, переименование и удаление (в том числе и в Recycle Bin) объектов файловой системы.
Функция возвращает 0, если операция выполнена успешно, и ненулевое значение в противном :-) случае.
Функция имеет единственный аргумент - структуру типа TSHFileOpStruct, в которой и передаются все необходимые данные.
Эта структура выглядит следующим образом:
Поля этой структуры имеют следующее назначение:
Если pFrom или pTo не указаны, берутся файлы из текущей директории. Текущую директорию можно установить с помощью функции SetCurrentDirectory и получить функцией GetCurrentDirectory.
А теперь - примеры
Разумеется, вам нужно вставить в секцию uses модуль ShellAPI, в котором определена функция SHFileOperation.
Рассмотрим самое простое - удаление файлов.
Обратите внимание, что ни один из флагов не установлен. Если вы хотите не просто удалить файлы, а переместить их в корзину, должен быть установлен флаг FOF_ALLOWUNDO.
Для удобства дальнейших экспериментов напишем функцию, создающую из массива строк буфер для передачи его в качестве параметра pFrom. После каждой строки в буфер вставляется нулевой байт, в конце списка - два нулевых байта.
Выглядит ужасно, но работает. Можно написать красивее, просто лень.
И, наконец, функция, удаляющая файлы, переданные ей в списке Names. Параметр ToRecycle определяет, будут ли файлы перемещены в корзину или удалены. Функция возвращает 0, если операция выполнена успешно, и ненулевое значение, если руки у кого-то растут не из того места, и этот кто-то всунул функции имена несуществующих файлов.
Обратите внимание, что мы освобождаем буфер Src простым присваиванием значения nil. Если верить документации, потери памяти при этом не происходит, а напротив, происходит корректное уничтожение динамического массива. Каким образом, правда - это рак мозга :-).
Вроде все работает.
Кстати, обнаружился забавный глюк - вызовем процедуру DeleteFiles таким образом:
Файлы 'Test1' и 'Test2' удаляются совсем, без помещения в корзину, несмотря на установленный флаг FOF_ALLOWUNDO. Мораль: при использовании функции SHFileOperation используйте полные пути всегда, когда это возможно.
Ну, с удалением файлов разобрались.
Теперь очередь за копированием и перемещением.
Следующая функция перемещает файлы указанные в списке Src в директорию Dest. Параметр Move определяет, будут ли файлы перемещаться или копироваться. Параметр AutoRename указывает, переименовывать ли файлы в случае конфликта имен.
Все в порядке (а кудa ж оно денется).
Есть, правда еще одна возможность - перемещать много файлов каждый в свою директорию за один присест, но я с трудом представляю, кому это может понадобиться.
Необходимо скопировать все файлы и подкаталоги одного каталога в другой. Но есть список с именами файлов, которые нужно скопировать с заменой без уведомления. Подскажите пожалуйста, как реализовать вот механизм замены без уведомления?
Копирование файла из одной директории в другую
Здравствуйте у меня возникла проблема не могу скопировать файл из одной директории в другую var .
Взять 4 файла из директории и переписать в другую директорию
Всем привет. Помогите решить задачку. Необходимо мне из одной директории считать 4 файла.
Копирование из заданной директории в директорию, которая будет указана в текстовом файле
Доброго времени суток! Столкнулся с проблемой. Нужно выполнить копирование из заданной директории в.
Перемещение или копирование БД в другую директорию
В общем проблема такая не могу скопировать или переместить базу данных в другое место на моем.
Спасибо. Подскажите, а как реализовать, чтобы при копировании с заменой скопировались не все файлы, а только несколько? Ну, например известный имена файлов, которые обязательно надо скопировать с заменой. А остальные пусть копируются как обычно
Есть папка D:\test1, содержащая одну папку test2, которая содержит файл tf.txt
D:\test1\test2\tf.txt
надо скопировать все содержимое на диск Е (должно получиться E:\test1\test2\tf.txt)
Так вот, на диске Е создается папка test1, а в ней файл (не папка) test2 без расширения.
Заметил, что на строке 20 процедуры __CopyFolder ув. vaberg
программа не входит в if
Подскажите, что я делаю не так!
PS. Lazarus1.4.4, Windows 10
Потому, что кроме того, что объект файловой системы может быть директорием (faDirectory), он может иметь и другие атрибуты - например, может быть скрытым (faHidden) и т. п..
Поэтому, проверка, является ли объект директорием, должна быть записана так:
Регулярное выражение для поиска определённых файлов и копирование их в другую директорию
Здраствуйте! Столкнулся с регулярными выражениями. Но такое дело что в них ничего понять не могу.
Копирование файлов из одной директории в другую
Всех приветствую Проблема такая, нужно скопировать файл из одной директории в другую.
Копирование всех файлов из одной директории в другую
Подскажите как правильнее написать скрипт который будет копировать файлы из одной директории в.
Копирование файлов в Ubuntu из одной директории в другую
Требуется написать программу на языке С,реализующую копирование файлов из одной директории в другую.
В статье рассматривается, как скопировать, переименовать или переместить каталог со всеми вложениями. Создание, удаление и проверка существует папка или нет, рассмотрена в предыдущей статье.
Проверка на наличие файла
Часто перед выполнением каких либо действий с файлом, необходимо убедиться в его существовании на диске. Для этих целей используется функция FileExists. Единственный строковый параметр функции содержит путь к файлу. При своем выполнении функция вернет значение true, если указанный файл есть. False, если файла нет.
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
В реальных программах иногда необходимо копировать, перемещать и удалять файлы. В Delphi для этих целей служат очень простые функции.
Эта функция возвращает true, если операция прошла успешно, и false, если неудачно.
Функция DeleteFiie умеет удалять только файлы и только по одному. У вас не получится работать сразу с несколькими файлами, и придется для каждого из них вызывать функцию удаления. Помимо этого, можно удалять только файлы. Если указать директорию, то операция не будет выполнена.
Для удаления директорий есть отдельная функция:
Функция возвращает true, если операция прошла успешно, и false, если неудачно.
Когда мы не указываем полный путь, а только имя файла или директории, то функции ищут эти файлы в текущей папке. Для изменения текущей папки служит функция chDir:
ChDir('Путь к папке, которая будет использоваться по умолчанию'); Это процедура, и у нее нет возвращаемого значения.
Текущую для программы директорию можно узнать с помощью функции GetCurrentDir, которой не надо ничего передавать, она просто возвращает текущую директорию.
Перед операциями над файлами и директориями желательно убедиться в их существовании. Для того чтобы узнать, существует ли файл, можно воспользоваться следующей функцией:
FileExists " 'Имя или полный путь к файлу');.
Если файл существует, то функция вернет true, иначе - false.
Узнать о существовании директории можно с помощью следующей функции:
Если директория существует, то вернет true, иначе - false.
Вот небольшой пример использования описанных функций:
В этом примере сначала изменяется текущая директория на корень диска С. После этого происходит проверка: если существует файл autoexec.bat, то он удаляется из текущей директории.
Использовать данные функции Delphi очень просто, но они имеют слишком мало возможностей и среди них нет хорошей функции для копирования и перемещения файлов. Среди справки Delphi можно найти описание функций копирования и перемещения, которые можно использовать в проектах. Для этого нужно только добавить их в свой проект.
Source, Dest: Integer; Len: Integer; Destination: const
GetMem(CopyBuffer, ChunkSize) ; try
Source:»FileOpen(FileName, fmShareDenyWrite);//Открыть файл-источник if Source " 0 then raise EFOpenError.CreateFmt(SFOpenError, [FileName]); try
Dest := FileCreate(Destination); //Создать файл-приемник if Dest " 0 then raise try
//Считать порцию файла
BytesCopied'.=FiieRead(Source,CopyBufЕегЛ,ChunkSize); if BytesCopied " 0 then //Если порция считана, то. //Записать ее в файл-приемник FileWrite(Dest, Copy-Buffer", BytesCopied); until BytesCopied " ChunkSize; finally
Процесс копирования очень прост. Процедура получает два имени файла: откуда копировать, и куда. После этого происходит проверка. Если в качестве второго параметра (путь к файлу, в который надо скопировать)' указана только директория без имени файла, то программа подставляет в качестве имени файла имя источника.
После этого источника открывается для чтения данных с запретом на запись со стороны других программ. Открыв источник, процедура создает файл приемника. Если он существовал, то без каких-либо предупреждений файл будет перезаписан. Дальше запускается цикл, в котором из файла источника считываются данные по 8 192 байт и тут же записываются в файл приемника. Таким образом, в цикле происходит копирование файла небольшими порциями. Чем больше порция, тем быстрее будет происходить копирование.
Процедура копирования - очень хороший пример использования функций работы с файлами. Все сделано очень грамотно и великолепно работает, хотя и не очень универсально. Например, нет вызова предупреждения о существовании результирующего файла перед его уничтожением. Но это не так уж сложно сделатьС помощью функции F і 1 е Е х і s t s.
Теперь посмотрим на реализацию функции перемещения файлов (листинг 3.14). |1иС™нг^
Эта функция также получает в качестве параметров два имени файла: источника и приемника. В начале функции происходит попытка переименовать файл источника в приемник. Если оба файла находятся на одном диске, то такая операция произойдет успешно, и файл-источник без копирования превратится в файл-приемник с помощью простого изменения пути расположения.
Если источник и приемник находятся на разных дисках, то такой трюк не пройдет, поэтому процедура вызовет функцию описанную выше, для копирования источника в новое место, а потом удалит файл запуска файла можно использовать следующую универсальную функцию (листинг 3.15).
Чтобы ее использовать, нужно добавить это описание в свой модуль. Только не забудьте добавить еще в раздел uses модуль shellAPi, иначе проект нельзя будет скомпилировать.
У функции четыре параметра.
П Имя ' файла, или полный путь к файлу, который надо запустить.
□ Параметры, которые надо передать запускаемой программе (то, что нужно написать в командной строке).
□ Директория по умолчанию, с которой должна работать программа. Если директория не указана, то будет использоваться та, в которой находится запускаемый файл.
□ Способ отображения запущенного файла. Набор способов идентичен тому, ЧТО МЫ ИСПОЛЬЮВатИ В функции Showwindow.
Вот простой пример использования данной функции:
С помощью этой же функции можно запускать Internet Explorer (или другой браузер, который установлен по умолчанию) и загрузить Интернет-страничку:
Если нужно создать электронное письмо, то это можно сделать следующим способом:
Функцию ShellExecute мы уже рассматривали в разд. 2.5, и все же я решил описать ее еще раз, чтобы выделить в отдельную процедуру. Применяя ее, вам не надо следить за типом pchar, который используется- для передачи строк, потому что наша функция ExecuteFile сама сделает необходимые преобразования.
И сейчас мы перейдем к реальному примеру, который будем .изучать на практике. Создайте новый проект и перенесите на форму два компонента: ShellTreeView И ShellListView. У компонента ShellTreeView В СВОЙСТВе нужно указать компонент чтобы связать в одно целое. У компонента ShellListView нужно установить свойству Mutiselect значение true, чтобы мы могли выбирать несколько файлов.
Теперь нужно добавить панель, на которой мы разместим четыре кнопки: Копировать, Переместить, Удалить, Свойства. Мою форму будущей программы вы можете увидеть на рис. 3.17.
Рис. 3.17. Форма будущей программы работы с несколькими файлами
Теперь перейдите в раздел uses и добавьте туда два модуля: shellapt. и FileCtrl. ПерВЫЙ МОДУЛЬ необходим ДЛЯ работы фуНКЦИИ SHFileOperation. Во ВЮрОМ есть фунКЦИЯ SelectDirectory, которая ВЫЮДИТ на экран стандартное окно выбора директории. Это окно мы будем использовать, когда нужно будет выбрать директорию, в которую надо скопировать или переместить файлы.
В разделе private добавим описание следующей функции:
private < Private declarations >function DoSHFileOp(Handle: THandle; OpMode: UInt; Src, Dest: string; DelRicleBin; Boolean): Boolean; Эта функция будет универсальная: для копирования, перемещения и удаления файлов. Нажмите "Ctrl"+"Shift"+"C", чтобы создать заготовку этой функции. В этой заготовке нужно написать следующее (листинг 3.16).
Листинг3.16. Универсальная функция для работы с файлами Г
function TForml.DoSHFileOp (Handle: THandle; CpMode: UInt; Src,.
Для функции SHFiieOperation нужен только один параметр- структура типа TSHFileOpStruct. Такой переменной является ipFiieOp. Прежде чем использовать эту структуру, мы заполним ее нулями с помощью функции Fiilchar, чтобы там случайно не оказались ненужные данные. Теперь перечислим свойства, которые нужно заполнить.
□ wnd - указатель на окно, которое будет являться владельцем выполняемого процесса (копирование, перемещение, удаление).
□ wFunc - операция, которую надо выполнить. Сюда будет записано передаваемое значение.
- путь-источник, который мы получаем в качестве третьего параметра.
рто - путь-приемник, который мы получаем в качестве четвертого параметра.
□ fFlags - флаги. Если в качестве данного параметра указано true, то мы выставляем флаг fof_allowundo. этот флаг говорит о том, что при удалении файлы будут попадать в корзину. Иначе будет установлен флаг fof_noconfirmmkdir, который указывает на то, что не надо запрашивать подтверждения при необходимости во время выполнения операции создать директорию. Вы можете также указывать следующие флаги (для того, чтобы выставить несколько флагов, пишите их через знак " + "):
• fof_simpleprogress - показать окно выполнения процесса, но не отображать имена файлов.
• IpszProgressTitle - текст, который будет отображаться в окне хода выполнения операции.
□ fAnyoperationsAborted - это свойство будет равно true, если пользователь прервал выполнение операции.
После раздела vaг и перед ключевым словом implementation напишите следующий код:
FileOpMode: array[0..3] of UInt =
Здесь мы объявили массив из четырех значений. Каждое из значений - это константа для обозначения определенной операции:
Теперь создадим обработчики событий для нажатия кнопок нашей панели. Сначала создайте обработчик события onclick для кнопки Копировать. В нем нужно написать следующий код (листинг 3.17).
for i := 0 to do if (ShellListViewl.items.item[i].Selected) then begin FSrc:=FSrc+
Прежде чем производить попытку копирования, надо проверить, выбрал ли пользователь какие-либо файлы. Если нет, то нужно выйти из процедуры, потому что копировать нечего. Эта проверка происходит во второй строке кода:
После этого на экран выводится окно выбора директории, в которую нужно будет скопировать выбранные файлы. Делается это с помощью функции Если пользователь ничего не выбрал, то происходит выход из процедуры. Внешний вид окна выбора директории вы можете увидеть на рис. 3.18.
Рис. 3.18. Окно выбора директории
Теперь нужно узнать директорию, из которой происходит копирование. Полный путь находится в свойстве path компонента ShellTreeviewl. Также проверяется, если последний символ пути не равен знаку его нужно добавить:
for i := 0 to ShellListViewl.items.Count-1 do if (ShellListViewl. items, item[i] .Selected) then begin FSrc:=FSrc+
После этого вызывается написанная нами ранее процедура DoSHFiieOp, указывая все необходимые параметры. В качестве второго параметра указана операция, которую надо выполнить- FiieOpMode[0], что равно команде focopy. Третий и четвертый параметр - это пути источника и приемника (откуда и куда надо копировать).
Теперь напишем код для кнопки Переместить. Для этого в обработчике события onclick соответствующей кнопки пишем следующее (листинг 3.18).
for i := 0 to ShellListViewl.items.Count-1 do if (ShellListViewl.items.item[il.Selected) then begin FSrc:=FSrc+
Этот код идентичен тому, что мы написали для кнопки Копировать. Разница только в вызове процедуры DoSHFileOp, где мы указываем операцию FileOpMode [2], что означает перемещение. А в остальном там так же определяется директория, из которой нужно копировать, и так же формируется строка из имен файлов для копирования, разделенных нулевым символом.
В обработчике нажатия кнопки Удалить пишем следующий код (листинг 3.19).
for i := 0 to FilesListView.items.Count-1 do if then begin DelFName:=DelFName+
И снова код похож на тот, что мы уже использовали дважды. Но есть все-таки две разницы:
1. Мы проверяем, находится ли какой-нибудь файл в режиме редактирования ЕііезіЛз^іе*.І8Ес!Шп§. Если да, ТО ВЬМДМ ИЗ процедуры.
2. В вызове процедуры ОоЗНЕііеОр в качестве второго параметра мы напрямую указываем константу БорЕЬЕТЕ, хотя можно было бы указать РііеОрМоає [ 1], что абсолютно то же самое.
В обработчике нажатия кнопки Свойства напишем следующий код (листинг 3.20).
Здесь мало строчек кода, но с ним придется разбираться. В начале происходит простая проверка на выделение. Если пользователь ничего не выбрал, то выходим, иначе в следующей строке произойдет ошибка. Дальше мы вызываем функцию SHObjectProperties, которая отображает стандартное окно свойств объекта. У этой функции 4 параметра.
О Указатель на окно-владельца.
□ Второй параметр может принимать значения $01 для принтера или $02 для пути к файлу или папке.
□ Так как мы используем файлы и папки, то здесь должен быть полный путь к этому объекту.
О Последний параметр оставляем равным nil.
На рис. 3.19 вы можете увидеть стандартное окно свойств, вызванное из нашей программы.
Рис. 3.19. Стандартное окно свойств объекта
Чтобы проект теперь скомпилировался, нужно сообщить о существовании функции зногое^Ргорегг^ез, о которой Ш1рЫ еще не знает. Для этого создайте файл stan.dardDialogs.pas и напишите в нем следующее (листинг 3.21).
windows, Messages, SHlObj,-
//Cancel the operation and close the dialog.
TSHObjectProperties = function(hwndOwner: HWND); uFlags:
Теперь добавьте в раздел uses имя нашего модуля standardDialogs и скомпилируйте проект. Теперь можете запустить проект и посмотреть результат.
На компакт-диске в директории \Примеры\Глава 3\File Operation вы можете увидеть пример данной программы и цветные версии рисунков.
Копирование файла
Копирование файла выполняется функцией CopyFile, параметрами которой служит путь к исходному файлу и путь, где должна быть расположена копия файла.
Третий параметр определяет, будет ли перезаписан файл в случае, если файл с таким именем уже есть. Если параметр задан значением True, то в случае если файл уже есть, функция выполнять копирование не будет и вернет значение False. Таким образом, можно добавить дополнительную проверку и защитить информацию от потери из-за перезаписи файла.
Если третьим параметром указано значение False, то функция будет копировать файл с перезаписью, если файл уже есть и в результате всегда возвращать значение True.
Так как пути к файлам задаются параметром типа PChar, то использование строковых переменных в этой функции будет вызывать ошибку. Такая проблема может произойти, если, например, путь к файлу задавать в компонентах Edit или OpenDialog. В этом случае, нужно выполнить приведение типов данных к нужному виду:
Переименование файла
Для переименования файла используется функция RenameFile. Строковые параметры здесь так же содержат путь исходного файла и путь файла с новым именем.
Функция переименования так же возвращает результат своего выполнения логическим значением.
Учитывая, что во втором параметре можно указать не только новое имя файла, но и новый путь, эту функцию можно так же использовать для перемещения файла. Данную функцию так же можно использовать для переименования и перемещения папок со всеми их вложениями.
Перемещение файла
Чтобы при перемещении не выполнять два действия – копирование и удаление исходного файла, в Delphi имеется специальная функция MoveFile. Два параметра функции указывают путь исходного файла, и путь, куда должен быть перемещен файл.
Аналогично уже рассмотренным функциям, эта возвращает значение true, при успешном выполнении своих операций и false, при возникновении ошибки. Ошибка может возникнуть, например, при отсутствии исходного файла или наличии файла с заданным именем в новой директории.
При использовании компонентов и строковых переменных, здесь так же потребуется приведение типов данных:
Это функцию можно так же использовать для переименования файла, указав новое имя файла и сохранив старый путь.
Кроме того, функцию MoveFile можно применить для переименования или перемещения папки со всеми вложенными в нее файлами. В приведенном ниже примере, папка "myfolder" будет перемещена в поддиректорию "newfolder1" и переименована в "newfolder2".
Переименование и перемещение папок
Для перемещения каталогов можно использовать функцию MoveFile или RenameFile.
Возможности этих функций сходны. Для каждой указывается абсолютный или относительный путь к исходному каталогу, и новому, куда планируется перемещение. Если перемещение выполнено успешно, функции возвращают значение True, если нет, False.
Если же нужно просто переименовать папку, то новое имя папки указывается без изменения директории:
Отличие есть, если задавать директории строковой переменной или строковым свойством компонента (например, свойством Text, компонента Edit). Функция RenameFile, будет работать с простым указанием путей из компонентов:
Для функции MoveFile, при указании параметров необходимо выполнить приведение типов:
Для работы с файлами в Delphi есть богатый набор функций, позволяющий выполнять все необходимые действия с файлами. Механизм использования каждой из такой процедуры или функции достаточно прост – указание директории и имени файла, над которым производится действие и, иногда, указание дополнительных параметров для дополнительного контроля выполняемых операций.
В данной статье описываются возможности манипуляции с уже существующими файлами. Механизмы создания, открытия и сохранения файла описаны в статье "Создание и работа с текстовыми файлами в Delphi".
Копирование папки
Готовой функции для копирования папки, как для копирования файлов, нет. Поэтому здесь используются собственные пользовательские функции. Один из наиболее удобных методов, использует библиотеку ShellApi.
В разделе описаний необходимо добавить библиотеку:
При успешном выполнении копирования, функция вернет значение True, если были ошибки и копирование выполнено не корректно, вернет False.
Данная функция, выполняет копирование папки стандартными средствами операционной системы, а значит, в различных ситуациях это может быть видно. При копировании в уже существующую папку, будет выводиться запрос на обновление файлов, если такие уже имеются. Чтобы этого избежать в функцию добавляется флаг:
Этот флаг запрещает выводы запросов пользователю.
FOF_ALLOWUNDO – если есть возможность, удаление производится в корзину.
FOF_SILENT – запрещает показывать стандартное окно операционной системы с прогрессом копирования.
FOF_RENAMEONCOLLISION – если файл уже существует, копируется с добавлением «Копия» в имя файла или папки.
Удаление файла
Удаление файла в Delphi осуществляется с помощью функции DeleteFile. В качестве единственного параметра задается путь удаляемого файла.
В результате своего выполнения функция DeleteFile возвращает результат логического типа: true, если файл был удален; false, если файл не был удален (например, если файл отсутствует).
Читайте также: