复制文件时如有相同名称的如何复制到其他文件夹里
本帖最后由 dnvplj 于 2021-12-7 11:33 编辑请问各位朋友:现有3个文件(实际会有很多),循环复制到300文件夹里,如300文件夹里已有相同的文件,就在300文件夹下“新建文件夹”把其复制到该文件夹下。在复制文件的过程中如300或新建的文件夹里还有相同的文件,继续新建文件夹并把其复制到该文件夹下,以此类推。
#include <File.au3>
#include <Array.au3>
Local $Filea = @ScriptDir & '\300'
Local $a_File = _NetArray()
_FileExists($Filea, $a_File)
Func _NetArray()
Local $a_File
$a_File = @ScriptDir & '\12\321.txt'
$a_File = @ScriptDir & '\as\422.txt'
$a_File = @ScriptDir & '\efd\523.txt'
Return $a_File
EndFunc ;==>_NetArray
Func _FileExists($Filea, $a_File)
For $i = 1 To UBound($a_File, 1) - 1
If FileExists($a_File[$i]) Then
FileCopy($a_File[$i], $Filea)
EndIf
Next
EndFunc ;==>_FileExists
windows对于文件(夹)路径是有长度限制的,如你逻辑如此无限循环下去很容易就超出限制了。所以,首先应该改变思路,比如在一层目录里用不同的文件夹名转移重名文件。 afan 发表于 2021-12-7 11:05
windows对于文件(夹)路径是有长度限制的,如你逻辑如此无限循环下去很容易就超出限制了。所以,首先应该改 ...
请问A大,如何实践呢,请指教。 本帖最后由 itzyx 于 2021-12-7 11:19 编辑
#include <File.au3>
#include <Array.au3>
Local $Filea = @ScriptDir & '\300'
Local $a_File = _NetArray()
_FileExists($Filea, $a_File)
Func _NetArray()
Local $a_File
$a_File = @ScriptDir & '\12\321.txt'
$a_File = @ScriptDir & '\as\422.txt'
$a_File = @ScriptDir & '\efd\523.txt'
Return $a_File
EndFunc ;==>_NetArray
Func _FileExists($Filea, $a_File)
For $i = 1 To UBound($a_File) - 1
$FileFullname = StringRegExp($a_File[$i], '.+\\(.+)\.([^\.]+)', 3)
If Not FileExists($Filea&'\'&$FileFullname&'.'&$FileFullname) Then
FileCopy($a_File[$i], $Filea&'\')
Else
DirCreate($Filea&'-'&$i&'\')
FileCopy($a_File[$i],$Filea&'-'&$i&'\')
EndIf
Next
EndFunc ;==>_FileExists
这样可以吗? 本帖最后由 dnvplj 于 2021-12-7 11:29 编辑
itzyx 发表于 2021-12-7 11:18
这样可以吗?
感谢回复,第一次运行把3个文件都复制到了300文件夹里了,但第二次运行没有把文件复制到新建的文件夹里? 我这边测试OK啊.... 本帖最后由 dnvplj 于 2021-12-7 11:44 编辑
itzyx 发表于 2021-12-7 11:34
我这边测试OK啊....
可以了,新文件夹能建在300文件夹里面吗?如X:300\300-1;X:300\300-2等 dnvplj 发表于 2021-12-7 11:41
可以了,新文件夹能建在300文件夹里面吗?如X:300\300-1;X:300\300-2等
可以啊我只是提供个思路,具体的你可以自己改一下,如果名称就叫300
DirCreate($Filea&'\300-'&$i)
FileCopy($a_File[$i],$Filea&'\300-'&$i&'\')
本帖最后由 dnvplj 于 2021-12-7 12:32 编辑
itzyx 发表于 2021-12-7 11:57
可以啊我只是提供个思路,具体的你可以自己改一下,如果名称就叫300
本人对“正则”一点都不懂,请问:“$FileFullname = StringRegExp($a_File[$i], '.+\\(.+)\.([^\.]+)', 3)”这行是什么意思?
dnvplj 发表于 2021-12-7 12:13
本人对“正则”一点都不懂,请问:“$FileFullname = StringRegExp($a_File[$i], '.+\\(.+)\.([^\.]+)',...
匹配文件路径,返回完整匹配的数组;
我也只是勉强会一点,你可以看看这个正则介绍 https://www.autoitx.com/forum.php?mod=viewthread&tid=2925&highlight=%D5%FD%D4%F2%B1%ED%B4%EF%CA%BD30%B7%D6%D6%D3%C8%EB%C3%C5%BD%CC%B3%CC
本帖最后由 dnvplj 于 2021-12-7 12:34 编辑
itzyx 发表于 2021-12-7 12:28
匹配文件路径,返回完整匹配的数组;
我也只是勉强会一点,你可以看看这个正则介绍 https://www.autoitx ...
好的,谢谢。
另外,能少建文件夹吗?比如:复制文件时判断300有相同文件,就新建文件夹。之后复制文件时判断300文件夹是否有相同文件,如有在判断新建的文件里是否有相同的文件,如果在建新的文件夹没有相同的文件就复制到该文件夹,以此类推。 Local $sDir = @ScriptDir & '\300'
Local $aFile = _FileArray()
_FileBakCopy($sDir, $aFile)
Func _FileArray()
Local $a_File
$a_File = @ScriptDir & '\12\321.txt'
$a_File = @ScriptDir & '\as\422.txt'
$a_File = @ScriptDir & '\efd\523.txt'
Return $a_File
EndFunc ;==>_FileArray
Func _FileBakCopy($s_Dir, $a_File)
Local $sFN, $sBkDir = ''
For $i = 1 To UBound($a_File) - 1
$sFN = StringRegExpReplace($a_File[$i], '^.+\\', '')
If FileExists($s_Dir & '\' & $sFN) Then
If $sBkDir = '' Then $sBkDir = _CKCreateDir($s_Dir)
FileMove($s_Dir & '\' & $sFN, $sBkDir)
EndIf
FileCopy($a_File[$i], $s_Dir)
Next
EndFunc ;==>_FileBakCopy
Func _CKCreateDir($s_Dir)
Local $sDirIx = 1, $sDirNew = ''
While 1
$sDirNew = $s_Dir & '\' & StringFormat('%04d', $sDirIx)
If Not FileExists($sDirNew & '\') Then ExitLoop
$sDirIx += 1
WEnd
DirCreate($sDirNew)
Return $sDirNew
EndFunc ;==>_CKCreateDir dnvplj 发表于 2021-12-7 12:33
好的,谢谢。
另外,能少建文件夹吗?比如:复制文件时判断300有相同文件,就新建文件夹。之后 ...
A大给你出手解决了,我就不献丑了 afan 发表于 2021-12-7 12:44
多谢A大,问题解决了。 本帖最后由 dnvplj 于 2021-12-7 15:46 编辑
afan 发表于 2021-12-7 12:44
现一共4个文件,但一次只能复制2个文件。不管删除数组那2行,其他的2行都能复制成功。所用的文件:附件上传不了。Local $FileSele = @ScriptDir & '\300'
Local $aFile = _FileArray()
_FileBakCopy($FileSele, $aFile)
Func _FileArray()
Local $a_File
$a_File = @ScriptDir & '\134\1\2\3\新建文件夹62\新建文本文档.txt'
$a_File = @ScriptDir & '\134\1\2\新建文本文档.txt'
$a_File = @ScriptDir & '\134\3\新建文件夹62\新建文件夹963\txt\d\新建文件夹\eee\999\csr\egx\新建文本文档.txt'
$a_File = @ScriptDir & '\134\3\新建文件夹62\新建文件夹963\新建文本文档.txt'
Return $a_File
EndFunc ;==>_FileArray
Func _FileBakCopy($FileSele, $a_File)
Local $sFN, $sBkDir = ''
For $i = 1 To UBound($a_File) - 1
$sFN = StringRegExpReplace($a_File[$i], '^.+\\', '')
If FileExists($FileSele & '\' & $sFN) Then
If $sBkDir = '' Then $sBkDir = _CKCreateDir($FileSele)
FileMove($FileSele & '\' & $sFN, $sBkDir)
EndIf
FileCopy($a_File[$i], $FileSele)
Next
EndFunc ;==>_FileBakCopy
Func _CKCreateDir($FileSele)
Local $sDirIx = 1, $sDirNew = ''
While 1
$sDirNew = $FileSele & '\' & StringFormat('%04d', $sDirIx)
If Not FileExists($sDirNew & '\') Then ExitLoop
$sDirIx += 1
WEnd
DirCreate($sDirNew)
Return $sDirNew
EndFunc ;==>_CKCreateDir
页:
[1]
2