:: Visual Foxpro, Foxpro for DOS
не могу скопировать файлы командой COPY FILE
Chips
Автор

Сообщений: 93
Дата регистрации: 11.02.2016
Добрый день.
Не могу совершить элементарные действия по копированию файлов, помогите кто может.

Задача такая!
Есть две папки, из одной папки надо скопировать все файлы в другую папку.

Пытаюсь делать я это так:

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

Результат 0, но если я заменю после TO переменную на конкретно указанный путь работать будет.

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 "C:\test\Out"
ENDFOR

Но такой вариант меня не устраивает, так как там должна быть переменная.

И ещё проблема, в папка In все файлы называются крупными буквами AAA.txt, BBB.txt …
при копировании я получают файлы мелкого шрифта aaa.txt, bbb.txt … как этого ибежать?
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Sega

Сообщений: 511
Откуда: Ярославль
Дата регистрации: 27.12.2000
попробуй так:

COPY FILE loPathFile + arr_file(i, 1) TO (loPathOut)
Ratings: 0 negative/1 positive
Re: не могу скопировать файлы командой COPY FILE
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Chips
COPY FILE loPathFile + arr_file(i, 1) TO "C:\test\Out"

Но такой вариант меня не устраивает, так как там должна быть переменная.

Во-первых, в таких случаях путь можно (и нужно) указывать через "именованную переменную" - т.е. через скобки, при этом как раз и происходит нужная подстановка:
loPathOut = "C:\test\Out"
COPY FILE loPathFile + arr_file(i, 1) TO (loPathOut)
А во-вторых, если уж нужно копировать целиком папку - то лучше и копировать целиком папку! ;)
Например используя встроенные возможности Windows. Те же методы файловой системы FSO. Вдобавок все проблемы с регистром букв сами собой отпадут.


Например скопировать файлы без всяких "циклов" вполне можно вот таким кодом:
oFSO = CreateObject("Scripting.FileSystemObject")
oFSO.CopyFile("C:\test\In\*.txt", "C:\test\Out")
Единственно надо учитывать, что затираемые файлы не должны иметь атрибут "только чтение", иначе возникнет ошибка.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 1 раз(а). Последнее : Crispy, 03.08.16 13:24
Ratings: 0 negative/1 positive
Re: не могу скопировать файлы командой COPY FILE
Chips
Автор

Сообщений: 93
Дата регистрации: 11.02.2016
Crispy
Например скопировать файлы без всяких "циклов" вполне можно вот таким кодом:

oFSO = CreateObject("Scripting.FileSystemObject")
oFSO.CopyFile("C:\test\In\*.txt", "C:\test\Out")

Единственно надо учитывать, что затираемые файлы не должны иметь атрибут "только чтение", иначе возникнет ошибка.
Идея хорошая, я даже себе её в закладки добавил.
Но он не подходит, там файлов в папке может быть тысячи, массив arr_file приходится перегонять в курсор потом писать к нему запросы и уже по тому что осталось копировать файлы, если вкратце, то они не все нужны.

Решил проблему так:
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

Но все ровно осталось проблема с прописными буквами =(
Неужели придется писать еще один цикл в котором переименовывать файлы? +(
Ratings: 1 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Нда, два человека пишут про выражение имени, с примером кода - но нет, надо макро на кой то чёрт всунуть А потом жаловаться что не работает с пробелами в путях.
Chips
осталось проблема с прописными буквами
А хелп по ADIR почитать не пробовал? Про параметр nFlag в частности...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Chips
Но он не подходит, там файлов в папке может быть тысячи

А что по маске разве никак не выбрать?
Скажем в примере выше я написал копирование только для текстовых: "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-битных системах.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Crispy
а все досовские команды сегодня работают только через эмулятор ntvdm, т.е. соответственно лишь в 32-битных системах.
Нет, не так.
Это (copy, xcopy, ren, cd, md) не "досовские команды" ни разу - это команды командного интерпретатора. Если используется не архаичный command.com а его замена cmd.exe (как дОлжно делать уже лет 20 как - со времени окончательной смерти Win9x) то всё работает и будет работать и в x64 системе (в т.ч. и при запуске x64 версии этого самого командного интерпретатора).
Консольные команды ничуть не хуже COM-овских обёрток над всё тем же WinAPI


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Chips
Автор

Сообщений: 93
Дата регистрации: 11.02.2016
Crispy
В принципе само использование FSO это примерно то же, что использование прежних ДОС-команд типа COPY, XCOPY, которые когда-то зачастую бывало проще использовать в FPD вместо фокс-команд копирования, и которые при желании можно использовать конечно и сегодня, разве что FSO - это надстройка для механизмов работы с файлами непосредственно уже самой Windows, а все досовские команды сегодня работают только через эмулятор ntvdm, т.е. соответственно лишь в 32-битных системах.

Судя по всему придётся сделать именно так.
Спасибо за ответ.

Igor Korolyov
Chips
осталось проблема с прописными буквами

А хелп по ADIR почитать не пробовал? Про параметр nFlag в частности...

Прочитал, при чем тут флаг?

P.S.
Жаль что фоксовская команда работает криво.
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
Для плохо читающих:
nFlag
Определяет формат представления имен файлов в массиве (DOS-формат, или оригинальные имена).

nFlag
Описание значений Параметра
0
(по-умолчанию) имена файлов размещаются в массиве в верхнем регистре
1
Имена файлов представляются в оригинальном виде

2
Имена файлов представляются в нотации DOS 8+3 (как короткие имена)


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
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

И все работает без проблем
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Chips
Автор

Сообщений: 93
Дата регистрации: 11.02.2016
Будрин
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.

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

ssa
Для плохо читающих:
nFlag
Определяет формат представления имен файлов в массиве (DOS-формат, или оригинальные имена).

nFlag
Описание значений Параметра
0
(по-умолчанию) имена файлов размещаются в массиве в верхнем регистре
1
Имена файлов представляются в оригинальном виде
2
Имена файлов представляются в нотации DOS 8+3 (как короткие имена)

Да, в моей справке тоже так написано, но спрашиваю еще раз, как это должно мне помочь?
Вы понимаете что команде COPY FILE всё ровно какого реестра у вас там в массиве имена файлов, она их все ровно сделает маленькими.
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Chips
Автор

Сообщений: 93
Дата регистрации: 11.02.2016
Хорошо, фалы я скопировал так:

loPathFile = "C:\test\In\"
loPathOut = "C:\test\Out\"
koll_file = ADIR(arr_file, loPathFile + '*.txt')
FOR i = 1 TO koll_file
FSO = CreateObject("Scripting.FileSystemObject")
FSO.CopyFile ("C:\test\In\" + arr_file(i, 1), "C:\test\Out\", 0)
ENDFOR

Всё отлично, в конечной папке они получаются где надо с большими буквами.

А теперь пере домной встала проблема номер 2!
Мне нужно переименовать некоторые файлы.
Пытаюсь воспользоваться командой RENAME:
RENAME loPathOut + arr_file(1, 1) TO loPathOut + "Qsd"+ ".txt"
В результате вместо файла "Qsd.txt" я получаю файл "qsd.txt", опять маленькие буквы =(
В FSO я что-то не вижу метода rename =(
Плохо смотрю или у него какое-то экзотическое название?
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
Rename у FSO нет. Используй MoveFile.
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Chips
И где в тут написано что указанные мной переменные должны быть в скобках?
У меня была проблема именно потому что я не знал что надо заключить переменные в скобки, а компилятор ничего об это не сообщал.
В описании команды COPY FILE говорится о FileName а не о "имени переменной содержащей FileName". Чтобы в подобные команды всунуть таки переменную используется "выражение имени" - читать раздел хелпа Name Expression Creation. "Взятие в скобки" это как раз и есть выражение имени. Это более правильная альтернатива для макро - конечно же только там где допустимо использование таких выражений. В COPY FILE оно как раз допустимо.
Chips
Да, в моей справке тоже так написано, но спрашиваю еще раз, как это должно мне помочь?
Вы понимаете что команде COPY FILE всё ровно какого реестра у вас там в массиве имена файлов, она их все ровно сделает маленькими.
Одно другого не касается. Если имена УЖЕ взяты в uppercase то бороться за то чтобы оно чего-то там "сохраняло" смысла не имеет вообще. И да - фокс растёт со времён доса и файловых систем типа FAT12/FAT16 без поддержки "длинных имён", где регистр имён файлов в принципе невозможно было задать (сама система переводила всё в uppercase, если мне не изменяет склероз). Поэтому и фокс не отличается ни регистро-чувствительностью, ни регистро-сохраняемостью (он часто произвольно меняет регистр имён файлов с которыми работает - имея в виду и сами таблицы, и формы/отчёты/программы). Да, это порой напрягает но так уж он устроен.
Впрочем, для большинства практических применений это не имеет особого значения, т.к. винда в основе своей работает в регистро-нечувствительном виде (так устроено АПИ доступа к файлам) - даже если подлежащая файловая система регистрочувствительна (как NTFS). Т.е. весь смысл в "сохранении регистра имени файла" исключительно эстетический - на собственно работе с файлом это ну очень редко когда сказывается (хотя регистрочувствительный софт, конечно же, существует).

Про MoveFile уже сказали...
И ещё - создавать внутри цикла объект FSO совершенно не нужно - один раз достаточно его создать - перед циклом, или вообще где-нить в начале программы. Он (объект этот) не ограничен "одним копированием за время своей жизни"


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Chips
Автор

Сообщений: 93
Дата регистрации: 11.02.2016
Igor Korolyov
И ещё - создавать внутри цикла объект FSO совершенно не нужно - один раз достаточно его создать - перед циклом, или вообще где-нить в начале программы. Он (объект этот) не ограничен "одним копированием за время своей жизни"

Да, я это понимаю, но мне надо не все файлы из папки, а только определенные файлы из массива.
Тут у меня два варианта:
1) Перегнать массив в курсор, написать к курсору запросы и сканом по курсору скопировать файлы.
2) Создать цикл по массиву, при помощи функций анализировать имена файлов и выбирать нужные.

Taran
Используй MoveFile.
Не подходит, так как надо именно скопировать файлы.

Проблема в том что буквы становятся маленькими, дальнейшая обработка этих файлов требует сохранение имен файлов в исходном виде.



Исправлено 1 раз(а). Последнее : Chips, 05.08.16 14:07
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Chips
Автор

Сообщений: 93
Дата регистрации: 11.02.2016
Кажется получилось...

loPathFile = "C:\test\In\"
loPathOut = "C:\test\Out\"
koll_file = ADIR(arr_file, loPathFile + '*.txt')
FOR i = 1 TO koll_file
STRTOFILE(FILETOSTR(loPathFile + arr_file(i, 1)), loPathOut + ALLTRIM(STR(i)) + "Qer.txt")
ENDFOR

Вместо ALLTRIM(STR(i)) + "Qer.txt" надо поставить свою функцию MyFun(arr_file(i, 1))
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Chips
Igor Korolyov
И ещё - создавать внутри цикла объект FSO совершенно не нужно - один раз достаточно его создать - перед циклом, или вообще где-нить в начале программы. Он (объект этот) не ограничен "одним копированием за время своей жизни"
Да, я это понимаю
Нет, не понимаешь.
Вместо
FOR ...
FSO = CREATEOBJECT()
FSO.CopyFile(...)
ENDFOR
Я предложил сделать
FSO = CREATEOBJECT(...)
FOR ...
FSO.CopyFile(...)
ENDFOR
Про то чтобы отказаться от цикла я не писал вовсе.
Chips
Taran
Используй MoveFile.
Не подходит, так как надо именно скопировать файлы.
Ты спросил как переименовать файлы - это делает метод MoveFile. Копирование у тебя и так написано - можно и с заданием нового имени, конечно, копировать. Естественно для обработки "с учётом регистра" нужно в ADIR прописать параметр nFlag.
Chips
STRTOFILE(FILETOSTR(
И на кой чёрт гонять через память все эти файлы? Отвратительный вариант. FSO.CopyFile должно быть вполне достаточно для указания нужного регистра - если уж внешний софт таки чувствителен к регистру имён файлов.


------------------
WBR, Igor
Ratings: 0 negative/2 positive
Re: не могу скопировать файлы командой COPY FILE
Chips
Автор

Сообщений: 93
Дата регистрации: 11.02.2016
Igor Korolyov
Я предложил сделать
FSO = CREATEOBJECT(...)
FOR ...
FSO.CopyFile(...)
ENDFOR

Точно! =)

А разве MoveFile не вырезает файла?

Chips
FSO.CopyFile ("C:\test\In\" + arr_file(i, 1), "C:\test\Out\", 0)
К "C:\test\Out\" не прилепить имя файла.
Igor Korolyov
Chips
STRTOFILE(FILETOSTR(

И на кой чёрт гонять через память все эти файлы? Отвратительный вариант. FSO.CopyFile должно быть вполне достаточно для указания нужного регистра - если уж внешний софт таки чувствителен к регистру имён файлов.

Вариант может и отвратительный, но работает.
Других вариантов я не вижу.

Давайте я попробую описать задачу целиком, может кто нибудь предложит более удачное решение.
В папке С:\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(" иных я не вижу.
(этот вариант мне тоже не по душе, но пока работает так)

Важно сохранить большие буковки в имени файла.

Хм... надеюсь я понятно изложил задачу.
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
А почему не копировать API: CopyFile(S,S,I) (FilNam, lpNewFileName, bFailIfExists) ? API ф-ия не должна менять регистр в имени файла, наверное...

Найти файлы, входные/выходные имена сконструировать из полей таблицы fld1,fld2 (что за "запрос к базе данных ", откуда она берется что такое fld3 ?) - это просто.
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Chips
А разве MoveFile не вырезает файла?
Что значит "вырезает"? Не знаю таких действий Она их "переносит". Если перенести в ту же самую папку, но с новым именем, то это и будет необходимое "переименование". "Физически" при работе в рамках одного логического диска (раздела HDD, к примеру) само содержимое файлов не "переносится" - меняются лишь записи в папках ссылающиеся на этот самый файл. Т.е. подобное "перемещение" или "переименование" 10Гб-ного файла происходит так же быстро как и операция над пустым файлом (размером в 0 байт) - очень и очень быстро.
Chips
К "C:\test\Out\" не прилепить имя файла.
Кто тебе такое сказал
MSDN
CopyFile Method Copies one or more files from one location to another.
...
If source contains wildcard characters or destination ends with a path separator (\), it is assumed that destination is an existing folder in which to copy matching files. Otherwise, destination is assumed to be the name of a file to create
Chips
И эти файлы надо именно скопировать
Так и копируй - сразу с новым именем в новую папку В принципе для копирования STRTOFILE(FILETOSTR(...)) уже не так плохо как для переименования - но я бы всё равно не стал использовать
Кстати, есть ещё интересный вариант вместо целых копий файлов делать просто новые ссылки на уже существующие файлы - конечно если их по ходу дела не изменяют (только читают) - это гораздо быстрее по времени и практически не тратит дисковое пространство - работает на NTFS томах Правда в FSO нет для этого методов (не говоря уж про собственно фокс).

Chips
Далее мне необходимо переименовать вторую группу цифр в имени файла согласно полю fild3
Ну это просто - STUFF() если позиции строго фиксированы для любых файлов (т.е. как в примере - ровно 2 буквы, потом ровно 3 цифры - для всех файлов...) или STRTRAN() если точно известно что заменяемые цифры будут обрамлены символами "-" и "."
Ещё может быть полезно для ADIR указывать более точные маски поиска - вплоть до того чтобы искать подходящие файлы "по одному" - т.е. маской типа
lcPathIn + "??-003-034.txt"
Кстати, поиск ADIR делает в любом случае в НЕ регистрочувствительном виде, т.е. под "a*.txt" попадут и файлы с заглавной "A" или с расширением "TXT" и даже "TxT" - а флаг 1 в 4-м параметре ADIR позволит регистр имени файла не потерять - как тебе и нужно...


------------------
WBR, Igor
Ratings: 0 negative/1 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 31 (Гостей: 31)

© 2000-2024 Fox Club 
Яндекс.Метрика