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

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
(Кстати, SYS(2000, маска [,1]) ищет по маске, почти ADIR. Возвращает первое/очередное имя файла. Не проверял регистрозависимость возвращенного имени, но истиное имя можно получить GetShortPathName + GetLongPathName: forum.foxclub.ru)
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Chips
Автор

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

Хорошо, допустим API скопировала файлы не изменив регистр, а переименовать как ?

of63
Найти файлы, входные/выходные имена сконструировать из полей таблицы fld1,fld2 (что за "запрос к базе данных ", откуда она берется что такое fld3 ?) - это просто.

Не fld3, а fild3. Fild - поле(анг.)
Какая разница что за запрос, главное что в результате я получаю курсор с цифровой частью имени файла.
Igor Korolyov
Chips
К "C:\test\Out\" не прилепить имя файла.

Кто тебе такое сказал

Получилось прилепить.
Видимо я первый раз спешил и сделал что-то не то, фокс ругнулся и я не стал копать, так как юзверы требовали исполнения поставленной задачи в кротчайшие сроки.
Ну теперь получается можно переписать под FSO и убрать "STRTOFILE(FILETOSTR(".

БОЛЬШОЕ СПАСИБО.
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
Поле - это Field ;)


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
of63

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

имя1 (FilNam) --> имя2 (lpNewFileName) - это разве не переименование? А исходный файл (имя1) можно удалить...
Если новые имена пересекаются с уже имеющимися, то можно через промежуточный каталог копировать...


> Не fld3, а fild3. Fild - поле(анг.)
Какая разница что за запрос, главное что в результате я получаю курсор с цифровой частью имени файла.

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

Сообщений: 34580
Дата регистрации: 28.05.2002
Chips
Хорошо, допустим API скопировала файлы не изменив регистр, а переименовать как?
MoveFile

Кроме того, апи функция CopyFile при указании имени файла в качестве источника, требует указания имени ФАЙЛА в качестве назначения - она не копирует "файл в папку" - так что уж что что, а задать новое имя для копируемого файла не составляет никакого труда.


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

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
(это ужастно, несчастные 14 тыс. файлов, какой ужас, не смог переименовать... И куда полетят наши космолеты, запрограммированные аналогичными товарищами?... Да... Туда ) )
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Chips
В папке С:\test\in лежать следующие файлы:
qW-003-034.txt
rT-034-055.txt
Fi-088-002.txt
uO-001-088.txt
YI-499-546.txt

Я делаю запрос к базе данных и получаю курсор, в котором три номера:
fild1|fild2|fild3
003 | 034 | 001
088 | 002 | 001
001 | 088 | 002

По полям fild1 и fild2 надо скопировать файлы.

Далее мне необходимо переименовать вторую группу цифр в имени файла согласно полю 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

Если я правильно понял вышеприведенное описание, задача не совсем тривиальная таки получается.
А из-за того, что переименование идет по неопределенной маске, точнее задаваемой через курсор, в один этап похоже не решается.
Требуя разбивки на два:
1) копирование файлов по маске из курсора путем простого перебора его записей через сканирование,
2) переименование скопированных файлов.
Но поскольку при копировании используется маска, второй этап не получится вставить в тот же самый перебор записей курсора, а проще всего мне кажется сделать перебор уже скопированных файлов с поиском нужного переименования в том же курсоре.
Т.е. навскидку вот так как-то можно сделать:
* курсор масок:
CREATE CURSOR ctmp (fld1 c(3), fld2 c(3), fld3 c(3))
INSERT INTO ctmp VALUES ('003', '034', '001')
INSERT INTO ctmp VALUES ('088', '002', '001')
INSERT INTO ctmp VALUES ('001', '088', '002')
INDEX ON fld1 TAG fld1
cPath1 = "c:\test\in\"
cPath2 = "c:\test\out\"
* создание структуры файлов-папок для теста:
MD (cPath1)
MD (cPath2)
TEXT TO cFiles
qW-003-034.txt
rT-034-055.txt
Fi-088-002.txt
uO-001-088.txt
YI-499-546.txt
ENDTEXT
FOR lni=1 TO GETWORDCOUNT(cFiles)
COPY TO (cPath1 + GETWORDNUM(cFiles,lni)) SDF
ENDFOR
* создание структуры для теста вообще говоря, тебе надо было бы самому сразу привести, чтобы все видели образец!
* ну и собственно само копирование:
***
oFSO = CREATEOBJECT("Scripting.FileSystemObject")
SCAN
cFileName1 = "??-" + fld1 + "-" + fld2 + ".txt"
oFSO.CopyFile(cPath1+cFileName1, cPath2)
ENDSCAN
oFolder = oFSO.GetFolder(cPath2)
FOR EACH File In oFolder.Files
IF SEEK(SUBSTR(File.Name,4,3))
File.Name = STUFF(File.Name,8,3,fld3)
ENDIF
NEXT
***

Код в принципе уже рабочий, проверил ради интереса на приведенных именах файлов и каталогов. Хотя можно при желании конечно и еще подумать над ним, подкорректировав в ту или иную сторону.


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




Исправлено 8 раз(а). Последнее : Crispy, 10.08.16 07:28
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
sphinx

Сообщений: 31188
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Crispy
подкорректировав в ту или иную сторону

Как в сторону улучшений, так и в сторону ухудшений?


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Ну дык. [sm128]


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

Сообщений: 34580
Дата регистрации: 28.05.2002
Crispy
задача не совсем тривиальная таки получается.
Тривиальная. Решается за 1 проход по курсору и всего одно копирование на каждый нужный файл (сразу же с его переименованием).
Искать файл можно разными способами - можно сначала сделать гигантский ADIR на все файлы, и потом в нём уже многокнатно искать - есть "подходящий" файл или нет - если есть, то копировать с новым именем. Но мне кажется проще делать на каждую запись свой "мелкий" ADIR - где по логике автора темы будет всего 1 элемент (или не будет вообще ничего) - и его уже копировать с новым именем в новую папку. Если же он умолчал/не подумал о нюансах типа "неуникальных" файлов вида
ab-003-034.txt
cD-003-034.txt
Ef-003-034.txt
ну тогда внутри этого цикла ещё потребуется цикл по "строкам" ADIR - или, возможно, копировать нужно только первый попавшийся из "однономерных"


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

Сообщений: 18571
Дата регистрации: 16.05.2005
Много чего возможно, было бы желание.


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

Сообщений: 33855
Дата регистрации: 05.11.2006
Много чего желанно, была бы возможность. (приписывается спинзаю) [sm128]
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Chips
Автор

Сообщений: 93
Дата регистрации: 11.02.2016
of63
это ужастно, несчастные 14 тыс. файлов, какой ужас, не смог переименовать... И куда полетят наши космолеты, запрограммированные аналогичными товарищами?... Да... Туда ) )

Летят они куда надо, ибо программирую их не я!

Хотелось бы взглянуть на ваши коды и определить в какую сторону полетит ваш космолёт.

oFSO = CREATEOBJECT("Scripting.FileSystemObject")
SCAN
cFileName1 = "??-" + fld1 + "-" + fld2 + ".txt"
oFSO.CopyFile(cPath1+cFileName1, cPath2)
ENDSCAN
oFolder = oFSO.GetFolder(cPath2)
FOR EACH File In oFolder.Files
IF SEEK(SUBSTR(File.Name,4,3))
File.Name = STUFF(File.Name,8,3,fld3)
ENDIF
NEXT

Спасибо Crispy, в конечном итоге я так и сделал.



Исправлено 2 раз(а). Последнее : Chips, 11.08.16 17:37
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Так тов. Crispy код написал... Хотя строковые операции в фоксе подсказали уже давно (STUFF), в хелпе можно подобрать аналогичные, типа AT, GETWORDNUM (чтобы вычислить положение тире в имени, а не привязываться к фиксированному положению заменяемого 8,3), получить имя с сохранением регистра - FSO, или API, тоже подсказали, изменить имя - те же функции, файлы запрограммировали не Вы. Вроде исходные материалы все были даны. Еще моего кода не хватает ?
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Chips
Спасибо Crispy, в конечном итоге я так и сделал.
И очень зря.
Такой код потенциально будет перемешивать файлы - если вдруг "новый номер" пересечётся с уже существующим. Ну т.е. если сначала ты скопируешь
aa-001-001.txt
aa-001-002.txt

Без изменения имени, а потом начнёшь "переименовывать" их в, к примеру,
aa-001-001.txt -> aa-001-002.txt
aa-001-002.txt -> aa-001-001.txt

Первое же переименование сломается, т.к. такой файл уже есть, но он ещё не переименован При копировании сразу с новым именем такой проблемы не возникнет - будет лишь проблема уникальности - если вдруг по "таблице переименования" потребуется сделать странное:
aa-001-001.txt -> aa-001-005.txt
aa-001-002.txt -> aa-001-005.txt
aa-001-003.txt -> aa-001-005.txt


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

Сообщений: 1
Дата регистрации: 21.01.2018
если тебе нужно скопировать все файлы из одной папки в другую...
1. Упакуй архиватором все файлы в папку c:\#\ из папки c:\youprg\temp\*.* {Run /N rar.exe a -ep c:\#\arh c:\youprg\temp\*.*}
2. скопируй архив из папки c:\#\arh.rar куда надо... (файлы, если их много, быстрее копируются одним архивным файлом) {COPY FILE c:\#\arh.rar to d:\#\arh.rar}
3. если надо распакуй... {Run /N rar e -Y c:\#\arh.rar d:\#\}

P.S.
в корне программы,откуда запускаешь программу, должен быть файл "c:\youprg\rar.exe"
Ratings: 3 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
medstrах

Сообщений: 1810
Дата регистрации: 10.06.2019
Потрясающе!
Спасибо. СПАСИБО!
Ratings: 0 negative/0 positive
Re: не могу скопировать файлы командой COPY FILE
Перминов Игорь

Сообщений: 1591
Откуда: Красная Орловка
Дата регистрации: 16.09.2001
Код взят с нашего форума (очень давно) - автор не я:
*
* Действие над файлами
* tnHWND - дискриптор окна
* tcFrom - спецификация исходных файлов (можно указывать звёздочки и "?")
* tcTo - спецификация результирующих файлов (папки)
* tnOper - определяет тип операции.
* tnOper=1 - переместить файлы
* tnOper=2 - копировать файлы
* tnOper=3 - удалить файлы
* tnOper=4 - переименовать файл
*
FUNCTION FileOperation
LPARAMETER tnHWND, tcFrom, tcTo, tnOper
LOCAL lcSHFO, lcFrom, lnLenFrom, lcTo, lnLenTo, hGlobalFrom, hGlobalTo
LOCAL lnFlag, lnReturn
DECLARE Long SHFileOperation IN Shell32.dll String @
DECLARE Long DeleteFile IN kernel32.dll String @
DECLARE Long GlobalAlloc IN WIN32API Long, Long
DECLARE Long GlobalFree IN WIN32API Long
*
* Начинаем формировать структуру в переменной lcSHFO
*
*_screen.HWnd
* lcSHFO = BINTOC(thisform.HWnd, '4RS') && Поле hwnd структуры
lcSHFO = BINTOC(tnHWND, '4RS') && Поле hwnd структуры
lcSHFO = lcSHFO + BINTOC(tnOper, '4RS') && Поле wFunc - вид операции
*
* Обработка спецификации исходных файлов
*
tcFrom = tcFrom + CHR(0) + CHR(0) && Дописываем нули
lnLenFrom = LEN(tcFrom) && Длина исходной строки
hGlobalFrom = GlobalAlloc(0x0040, lnLenFrom) && Выделяем для неё
&& блок памяти
SYS(2600, hGlobalFrom, lnLenFrom, tcFrom) && и копируем туда строку
lcSHFO = lcSHFO + BINTOC(hGlobalFrom, '4RS') && Поле pFrom
*
* Обработка спецификации результирующих файлов
*
IF tnOper = 3
lcSHFO = lcSHFO + BINTOC(0, '4RS') && Если операции удаления
ELSE
tcTo = tcTo + CHR(0) + CHR(0) && Дописываем нули
lnLenTo = LEN(tcTo) && Длина результирующей строки
hGlobalTo = GlobalAlloc(0x0040, lnLenTo) && Выделяем для неё
&& блок памяти
SYS(2600, hGlobalTo, lnLenTo, tcTo) && и копируем туда строку
lcSHFO = lcSHFO + BINTOC(hGlobalTo, '4RS') && Поле pTo структуры
ENDIF
lnFlag = 8 + 512
lcSHFO = lcSHFO + BINTOC(lnFlag, '2RS') && Поле fFlags структуры
lcSHFO = lcSHFO + REPLICATE(CHR(0), 12) && Последние 3 поля структуры
*
* Выполняем операцию
*
IF tnOper = 3
lnReturn = DeleteFile(@tcFrom)
IF lnReturn > 0
lnReturn = 0
ELSE
lnReturn = -1
ENDIF
ELSE
lnReturn = SHFileOperation(@lcSHFO)
ENDIF
*
* Возвращаем память Windows
*
GlobalFree(hGlobalFrom)
IF tnOper != 3
GlobalFree(hGlobalTo)
ENDIF
*
* Если lnReturn = 0, то операция завершена успешно
*
IF lnReturn != 0
RETURN .f.
ENDIF
RETURN .t.


------------------
Без коментариев..
Ratings: 0 negative/0 positive


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

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

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