dnvplj 发表于 2021-12-7 09:43:46

复制文件时如有相同名称的如何复制到其他文件夹里

本帖最后由 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


afan 发表于 2021-12-7 11:05:23

windows对于文件(夹)路径是有长度限制的,如你逻辑如此无限循环下去很容易就超出限制了。所以,首先应该改变思路,比如在一层目录里用不同的文件夹名转移重名文件。

dnvplj 发表于 2021-12-7 11:14:35

afan 发表于 2021-12-7 11:05
windows对于文件(夹)路径是有长度限制的,如你逻辑如此无限循环下去很容易就超出限制了。所以,首先应该改 ...

请问A大,如何实践呢,请指教。

itzyx 发表于 2021-12-7 11:18:30

本帖最后由 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:26:55

本帖最后由 dnvplj 于 2021-12-7 11:29 编辑

itzyx 发表于 2021-12-7 11:18
这样可以吗?
感谢回复,第一次运行把3个文件都复制到了300文件夹里了,但第二次运行没有把文件复制到新建的文件夹里?

itzyx 发表于 2021-12-7 11:34:02

我这边测试OK啊....

dnvplj 发表于 2021-12-7 11:41:49

本帖最后由 dnvplj 于 2021-12-7 11:44 编辑

itzyx 发表于 2021-12-7 11:34
我这边测试OK啊....
可以了,新文件夹能建在300文件夹里面吗?如X:300\300-1;X:300\300-2等

itzyx 发表于 2021-12-7 11:57:13

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:13:17

本帖最后由 dnvplj 于 2021-12-7 12:32 编辑

itzyx 发表于 2021-12-7 11:57
可以啊我只是提供个思路,具体的你可以自己改一下,如果名称就叫300
本人对“正则”一点都不懂,请问:“$FileFullname = StringRegExp($a_File[$i], '.+\\(.+)\.([^\.]+)', 3)”这行是什么意思?

itzyx 发表于 2021-12-7 12:28:27

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:33:06

本帖最后由 dnvplj 于 2021-12-7 12:34 编辑

itzyx 发表于 2021-12-7 12:28
匹配文件路径,返回完整匹配的数组;
我也只是勉强会一点,你可以看看这个正则介绍 https://www.autoitx ...
    好的,谢谢。
    另外,能少建文件夹吗?比如:复制文件时判断300有相同文件,就新建文件夹。之后复制文件时判断300文件夹是否有相同文件,如有在判断新建的文件里是否有相同的文件,如果在建新的文件夹没有相同的文件就复制到该文件夹,以此类推。

afan 发表于 2021-12-7 12:44:27

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

itzyx 发表于 2021-12-7 13:05:10

dnvplj 发表于 2021-12-7 12:33
好的,谢谢。
    另外,能少建文件夹吗?比如:复制文件时判断300有相同文件,就新建文件夹。之后 ...

A大给你出手解决了,我就不献丑了

dnvplj 发表于 2021-12-7 13:53:02

afan 发表于 2021-12-7 12:44


多谢A大,问题解决了。

dnvplj 发表于 2021-12-7 15:35:33

本帖最后由 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
查看完整版本: 复制文件时如有相同名称的如何复制到其他文件夹里