не могу скопировать файлы командой COPY FILE | |
---|---|
Chips Автор Сообщений: 93 Дата регистрации: 11.02.2016 |
Добрый день.
Не могу совершить элементарные действия по копированию файлов, помогите кто может. Задача такая! Есть две папки, из одной папки надо скопировать все файлы в другую папку. Пытаюсь делать я это так:
Результат 0, но если я заменю после TO переменную на конкретно указанный путь работать будет.
Но такой вариант меня не устраивает, так как там должна быть переменная. И ещё проблема, в папка In все файлы называются крупными буквами AAA.txt, BBB.txt … при копировании я получают файлы мелкого шрифта aaa.txt, bbb.txt … как этого ибежать? |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Sega Сообщений: 511 Откуда: Ярославль Дата регистрации: 27.12.2000 |
попробуй так:
|
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
Во-первых, в таких случаях путь можно (и нужно) указывать через "именованную переменную" - т.е. через скобки, при этом как раз и происходит нужная подстановка:
Например используя встроенные возможности Windows. Те же методы файловой системы FSO. Вдобавок все проблемы с регистром букв сами собой отпадут. Например скопировать файлы без всяких "циклов" вполне можно вот таким кодом:
------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) Исправлено 1 раз(а). Последнее : Crispy, 03.08.16 13:24 |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Chips Автор Сообщений: 93 Дата регистрации: 11.02.2016 |
Идея хорошая, я даже себе её в закладки добавил. Но он не подходит, там файлов в папке может быть тысячи, массив arr_file приходится перегонять в курсор потом писать к нему запросы и уже по тому что осталось копировать файлы, если вкратце, то они не все нужны. Решил проблему так:
Но все ровно осталось проблема с прописными буквами =( Неужели придется писать еще один цикл в котором переименовывать файлы? +( |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Нда, два человека пишут про выражение имени, с примером кода - но нет, надо макро на кой то чёрт всунуть А потом жаловаться что не работает с пробелами в путях.
А хелп по ADIR почитать не пробовал? Про параметр nFlag в частности... ------------------ WBR, Igor |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
А что по маске разве никак не выбрать? Скажем в примере выше я написал копирование только для текстовых: "C:\test\In\*.txt", как оно и в твоем примере - количество же файлов при этом не имеет значения! Даже если их будут тысячи - одна строка команды сделает это точно также. Раз уж указана звездочка в маске имени. С нею вообще можно почти как угодно варьировать. Например без указания расширения будет копировать все из папки: "C:\test\In\*". Также и с более хитрым выбором: "C:\test\In\r*t.txt" - выберет любые файлы подобного типа: r1t.txt, r123t.txt? r123456t.txt и т.п. Используя же дополнительно подстановочные знаки "?" можно создавать маски с неопределенными символами уже в конкретных позициях имени. Т.е. в любом случае данная команда ничуть не меньше дает возможностей для копирования, чем твой цикл. ;) В принципе само использование FSO это примерно то же, что использование прежних ДОС-команд типа COPY, XCOPY, которые когда-то зачастую бывало проще использовать в FPD вместо фокс-команд копирования, и которые при желании можно использовать конечно и сегодня, разве что FSO - это надстройка для механизмов работы с файлами непосредственно уже самой Windows, а все досовские команды сегодня работают только через эмулятор ntvdm, т.е. соответственно лишь в 32-битных системах. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Нет, не так. Это (copy, xcopy, ren, cd, md) не "досовские команды" ни разу - это команды командного интерпретатора. Если используется не архаичный command.com а его замена cmd.exe (как дОлжно делать уже лет 20 как - со времени окончательной смерти Win9x) то всё работает и будет работать и в x64 системе (в т.ч. и при запуске x64 версии этого самого командного интерпретатора). Консольные команды ничуть не хуже COM-овских обёрток над всё тем же WinAPI ------------------ WBR, Igor |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Chips Автор Сообщений: 93 Дата регистрации: 11.02.2016 |
Судя по всему придётся сделать именно так. Спасибо за ответ.
Прочитал, при чем тут флаг? P.S. Жаль что фоксовская команда работает криво. |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
ssa Сообщений: 13008 Откуда: Москва Дата регистрации: 23.03.2005 |
Для плохо читающих:
nFlag Определяет формат представления имен файлов в массиве (DOS-формат, или оригинальные имена). nFlag Описание значений Параметра 0 (по-умолчанию) имена файлов размещаются в массиве в верхнем регистре 1 Имена файлов представляются в оригинальном виде 2 Имена файлов представляются в нотации DOS 8+3 (как короткие имена) ------------------ Лень - это неосознанная мудрость. |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Будрин Сообщений: 181 Откуда: Москва Дата регистрации: 21.09.2001 |
Зашел в help и читаю:
COPY FILE creates a duplicate of the file whose name is specified in FileName1. You can use COPY FILE to copy any type of file. The file to be copied cannot be open. You must include the extensions for both the source file name FileName1 and destination file name FileName2. Я обычно использую команду copy примерно так: loPathFile = "C:\test\In\" loPathOut = "C:\test\Out\*.*" koll_file = ADIR(arr_file, loPathFile + '*.txt') FOR i = 1 TO koll_file COPY FILE (loPathFile + arr_file(i, 1)) TO (loPathOut) ENDFOR И все работает без проблем |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Chips Автор Сообщений: 93 Дата регистрации: 11.02.2016 |
И где в тут написано что указанные мной переменные должны быть в скобках? У меня была проблема именно потому что я не знал что надо заключить переменные в скобки, а компилятор ничего об это не сообщал.
Да, в моей справке тоже так написано, но спрашиваю еще раз, как это должно мне помочь? Вы понимаете что команде COPY FILE всё ровно какого реестра у вас там в массиве имена файлов, она их все ровно сделает маленькими. |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Chips Автор Сообщений: 93 Дата регистрации: 11.02.2016 |
Хорошо, фалы я скопировал так:
Всё отлично, в конечной папке они получаются где надо с большими буквами. А теперь пере домной встала проблема номер 2! Мне нужно переименовать некоторые файлы. Пытаюсь воспользоваться командой RENAME:
В FSO я что-то не вижу метода rename =( Плохо смотрю или у него какое-то экзотическое название? |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Taran Сообщений: 13626 Откуда: Красноярск Дата регистрации: 16.01.2008 |
Rename у FSO нет. Используй MoveFile.
|
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
В описании команды COPY FILE говорится о FileName а не о "имени переменной содержащей FileName". Чтобы в подобные команды всунуть таки переменную используется "выражение имени" - читать раздел хелпа Name Expression Creation. "Взятие в скобки" это как раз и есть выражение имени. Это более правильная альтернатива для макро - конечно же только там где допустимо использование таких выражений. В COPY FILE оно как раз допустимо. Одно другого не касается. Если имена УЖЕ взяты в uppercase то бороться за то чтобы оно чего-то там "сохраняло" смысла не имеет вообще. И да - фокс растёт со времён доса и файловых систем типа FAT12/FAT16 без поддержки "длинных имён", где регистр имён файлов в принципе невозможно было задать (сама система переводила всё в uppercase, если мне не изменяет склероз). Поэтому и фокс не отличается ни регистро-чувствительностью, ни регистро-сохраняемостью (он часто произвольно меняет регистр имён файлов с которыми работает - имея в виду и сами таблицы, и формы/отчёты/программы). Да, это порой напрягает но так уж он устроен. Впрочем, для большинства практических применений это не имеет особого значения, т.к. винда в основе своей работает в регистро-нечувствительном виде (так устроено АПИ доступа к файлам) - даже если подлежащая файловая система регистрочувствительна (как NTFS). Т.е. весь смысл в "сохранении регистра имени файла" исключительно эстетический - на собственно работе с файлом это ну очень редко когда сказывается (хотя регистрочувствительный софт, конечно же, существует). Про MoveFile уже сказали... И ещё - создавать внутри цикла объект FSO совершенно не нужно - один раз достаточно его создать - перед циклом, или вообще где-нить в начале программы. Он (объект этот) не ограничен "одним копированием за время своей жизни" ------------------ WBR, Igor |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Chips Автор Сообщений: 93 Дата регистрации: 11.02.2016 |
Да, я это понимаю, но мне надо не все файлы из папки, а только определенные файлы из массива. Тут у меня два варианта: 1) Перегнать массив в курсор, написать к курсору запросы и сканом по курсору скопировать файлы. 2) Создать цикл по массиву, при помощи функций анализировать имена файлов и выбирать нужные. Не подходит, так как надо именно скопировать файлы. Проблема в том что буквы становятся маленькими, дальнейшая обработка этих файлов требует сохранение имен файлов в исходном виде. Исправлено 1 раз(а). Последнее : Chips, 05.08.16 14:07 |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Chips Автор Сообщений: 93 Дата регистрации: 11.02.2016 |
Кажется получилось...
Вместо ALLTRIM(STR(i)) + "Qer.txt" надо поставить свою функцию MyFun(arr_file(i, 1)) |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Нет, не понимаешь. Вместо
Ты спросил как переименовать файлы - это делает метод MoveFile. Копирование у тебя и так написано - можно и с заданием нового имени, конечно, копировать. Естественно для обработки "с учётом регистра" нужно в ADIR прописать параметр nFlag. И на кой чёрт гонять через память все эти файлы? Отвратительный вариант. FSO.CopyFile должно быть вполне достаточно для указания нужного регистра - если уж внешний софт таки чувствителен к регистру имён файлов. ------------------ WBR, Igor |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Chips Автор Сообщений: 93 Дата регистрации: 11.02.2016 |
Точно! =) А разве MoveFile не вырезает файла? К "C:\test\Out\" не прилепить имя файла.
Вариант может и отвратительный, но работает. Других вариантов я не вижу. Давайте я попробую описать задачу целиком, может кто нибудь предложит более удачное решение. В папке С:\test\in лежать следующие файлы: qW-003-034.txt rT-034-055.txt Fi-088-002.txt uO-001-088.txt YI-499-546.txt И т.д. Максимальное количество которое я видел это 14 тыс. с копейками, но может быть и больше. Но для примера пускай их будет 5. (Имена файлов не совпадают с реальными, но суть проблемы отражают верно) Я делаю запрос к базе данных и получаю курсор, в котором три номера: fild1|fild2|fild3 003 | 034 | 001 088 | 002 | 001 001 | 088 | 002 По полям fild1 и fild2 надо скопировать файлы. И эти файлы надо именно скопировать, так как количество файлов в папке IN должно остаться неизменным. Далее мне необходимо переименовать вторую группу цифр в имени файла согласно полю fild3: qW-003-034.txt --> qW-003-001.txt Fi-088-002.txt --> Fi-088-001.txt uO-001-088.txt --> uO-001-002.txt Кроме ужасного варианта с "STRTOFILE(FILETOSTR(" иных я не вижу. (этот вариант мне тоже не по душе, но пока работает так) Важно сохранить большие буковки в имени файла. Хм... надеюсь я понятно изложил задачу. |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
А почему не копировать API: CopyFile(S,S,I) (FilNam, lpNewFileName, bFailIfExists) ? API ф-ия не должна менять регистр в имени файла, наверное...
Найти файлы, входные/выходные имена сконструировать из полей таблицы fld1,fld2 (что за "запрос к базе данных ", откуда она берется что такое fld3 ?) - это просто. |
Re: не могу скопировать файлы командой COPY FILE | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Что значит "вырезает"? Не знаю таких действий Она их "переносит". Если перенести в ту же самую папку, но с новым именем, то это и будет необходимое "переименование". "Физически" при работе в рамках одного логического диска (раздела HDD, к примеру) само содержимое файлов не "переносится" - меняются лишь записи в папках ссылающиеся на этот самый файл. Т.е. подобное "перемещение" или "переименование" 10Гб-ного файла происходит так же быстро как и операция над пустым файлом (размером в 0 байт) - очень и очень быстро. Кто тебе такое сказал
Так и копируй - сразу с новым именем в новую папку В принципе для копирования STRTOFILE(FILETOSTR(...)) уже не так плохо как для переименования - но я бы всё равно не стал использовать Кстати, есть ещё интересный вариант вместо целых копий файлов делать просто новые ссылки на уже существующие файлы - конечно если их по ходу дела не изменяют (только читают) - это гораздо быстрее по времени и практически не тратит дисковое пространство - работает на NTFS томах Правда в FSO нет для этого методов (не говоря уж про собственно фокс). Ну это просто - STUFF() если позиции строго фиксированы для любых файлов (т.е. как в примере - ровно 2 буквы, потом ровно 3 цифры - для всех файлов...) или STRTRAN() если точно известно что заменяемые цифры будут обрамлены символами "-" и "." Ещё может быть полезно для ADIR указывать более точные маски поиска - вплоть до того чтобы искать подходящие файлы "по одному" - т.е. маской типа lcPathIn + "??-003-034.txt" Кстати, поиск ADIR делает в любом случае в НЕ регистрочувствительном виде, т.е. под "a*.txt" попадут и файлы с заглавной "A" или с расширением "TXT" и даже "TxT" - а флаг 1 в 4-м параметре ADIR позволит регистр имени файла не потерять - как тебе и нужно... ------------------ WBR, Igor |
© 2000-2024 Fox Club  |