找回密码
 加入
搜索
查看: 2811|回复: 20

[系统综合] 复制文件时如有相同名称的如何复制到其他文件夹里

[复制链接]
发表于 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[4]
        $a_File[1] = @ScriptDir & '\12\321.txt'
        $a_File[2] = @ScriptDir & '\as\422.txt'
        $a_File[3] = @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

发表于 2021-12-7 11:05:23 | 显示全部楼层
windows对于文件(夹)路径是有长度限制的,如你逻辑如此无限循环下去很容易就超出限制了。所以,首先应该改变思路,比如在一层目录里用不同的文件夹名转移重名文件。
 楼主| 发表于 2021-12-7 11:14:35 | 显示全部楼层
afan 发表于 2021-12-7 11:05
windows对于文件(夹)路径是有长度限制的,如你逻辑如此无限循环下去很容易就超出限制了。所以,首先应该改 ...

请问A大,如何实践呢,请指教。
发表于 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[4]
        $a_File[1] = @ScriptDir & '\12\321.txt'
        $a_File[2] = @ScriptDir & '\as\422.txt'
        $a_File[3] = @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[0]&'.'&$FileFullname[1]) Then
                                   FileCopy($a_File[$i], $Filea&'\')
                            Else
                                   DirCreate($Filea&'-'&$i&'\')
                                   FileCopy($a_File[$i],$Filea&'-'&$i&'\')
                           EndIf
        Next
EndFunc   ;==>_FileExists


这样可以吗?

评分

参与人数 1金钱 +22 收起 理由
dnvplj + 22 很给力!

查看全部评分

 楼主| 发表于 2021-12-7 11:26:55 | 显示全部楼层
本帖最后由 dnvplj 于 2021-12-7 11:29 编辑

感谢回复,第一次运行把3个文件都复制到了300文件夹里了,但第二次运行没有把文件复制到新建的文件夹里?
发表于 2021-12-7 11:34:02 | 显示全部楼层
我这边测试OK啊....

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 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等
发表于 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&'\')

 楼主| 发表于 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)”这行是什么意思?
发表于 2021-12-7 12:28:27 | 显示全部楼层
dnvplj 发表于 2021-12-7 12:13
本人对“正则”一点都不懂,请问:“$FileFullname = StringRegExp($a_File[$i], '.+\\(.+)\.([^\.]+)',  ...

匹配文件路径,返回完整匹配的数组;
我也只是勉强会一点,你可以看看这个正则介绍 https://www.autoitx.com/forum.ph ... B%C3%C5%BD%CC%B3%CC
 楼主| 发表于 2021-12-7 12:33:06 | 显示全部楼层
本帖最后由 dnvplj 于 2021-12-7 12:34 编辑
itzyx 发表于 2021-12-7 12:28
匹配文件路径,返回完整匹配的数组;
我也只是勉强会一点,你可以看看这个正则介绍 https://www.autoitx ...

    好的,谢谢。
    另外,能少建文件夹吗?比如:复制文件时判断300有相同文件,就新建文件夹。之后复制文件时判断300文件夹是否有相同文件,如有在判断新建的文件里是否有相同的文件,如果在建新的文件夹没有相同的文件就复制到该文件夹,以此类推。
发表于 2021-12-7 12:44:27 | 显示全部楼层
Local $sDir = @ScriptDir & '\300'
Local $aFile = _FileArray()
_FileBakCopy($sDir, $aFile)

Func _FileArray()
        Local $a_File[4]
        $a_File[1] = @ScriptDir & '\12\321.txt'
        $a_File[2] = @ScriptDir & '\as\422.txt'
        $a_File[3] = @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

评分

参与人数 1金钱 +40 收起 理由
dnvplj + 40 很给力!

查看全部评分

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

A大给你出手解决了,我就不献丑了
 楼主| 发表于 2021-12-7 13:53:02 | 显示全部楼层

多谢A大,问题解决了。
 楼主| 发表于 2021-12-7 15:35:33 | 显示全部楼层
本帖最后由 dnvplj 于 2021-12-7 15:46 编辑

现一共4个文件,但一次只能复制2个文件。不管删除数组那2行,其他的2行都能复制成功。所用的文件:附件上传不了。
Local $FileSele = @ScriptDir & '\300'
Local $aFile = _FileArray()
_FileBakCopy($FileSele, $aFile)

Func _FileArray()
        Local $a_File[5]
        $a_File[1] = @ScriptDir & '\134\1\2\3\新建文件夹62\新建文本文档.txt'
        $a_File[2] = @ScriptDir & '\134\1\2\新建文本文档.txt'
        $a_File[3] = @ScriptDir & '\134\3\新建文件夹62\新建文件夹963\txt\d\新建文件夹\eee\999\csr\egx\新建文本文档.txt'
        $a_File[4] = @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

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-22 22:42 , Processed in 0.082512 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表