首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用.NET System.IO File.Copy按顺序复制文件

使用.NET System.IO File.Copy按顺序复制文件
EN

Stack Overflow用户
提问于 2016-03-31 13:55:38
回答 4查看 1.3K关注 0票数 2

我正在windows应用程序中创建一个基本的文件复制操作。我注意到System.IO File.Copy文件是随机复制的。是否有一种方法可以控制哪些文件应该首先复制。例如,如果我们想从最小到最大的文件大小开始复制文件。或者按照字母顺序,从A到Z开始用文件名复制文件,或者从1到100按文件名的数字顺序复制文件。

我使用这个简单的代码从一个文件夹复制文件,但是这个文件是“随机的”复制的。见下文:

代码语言:javascript
复制
Private Sub btnCopy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCopy.Click
    Dim source as string = "c:\copyfiles"
    Dim destination as string = "d:\backup"
    Dim filepath as string = destination & "\"

        For Each filename As String In Directory.GetFiles(source)
            If File.Exists(filename) Then
                Dim dFile As String = String.Empty
                Dim dFilePath As String = String.Empty

                dFile = Path.GetFileName(filename)  'get filenames from source
                dFilePath = filepath & dFile  'concatenate filepath and filename

                File.Copy(filename, dFilePath, True) 'copy files from "c:\copyfiles" folder to destination
            End If

        Next
        MsgBox("Copy Successful", vbOKOnly, "Message")
End Sub
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-03-31 14:11:31

如果您确实希望通过名称以外的其他方法来处理它们(smallest to largest file size,或者可能是最新的或最老的),那么您应该使用DirectoryInfo来获取这些FileInfo属性。

代码语言:javascript
复制
' simple ordering by size
Dim dix As New DirectoryInfo(_your_file_path)
For Each f As FileInfo In dix.EnumerateFiles.
               OrderByDescending(Function(o) o.Length)
    ' do stuff
Next

如果您认为您可能还需要过滤器(即自上次运行文件以来就复制文件),那么EnumerateFiles而不是带有某些linq的GetFiles()将更有效。在这种情况下,.NET将计算您的过滤器,并且只返回与您的过滤器匹配的过滤器,而不是所有匹配的过滤器,以便您在代码中手动排除它们:

代码语言:javascript
复制
' process only TXT files in order of size
For Each f As FileInfo In dix.EnumerateFiles.
                Where(Function(w) w.Name.EndsWith(".txt")).
                OrderByDescending(Function(o) o.Length)
    ' do stuff
Next
票数 3
EN

Stack Overflow用户

发布于 2016-03-31 13:59:40

不要在Directory.GetFiles()中使用foreach,而是将结果放入列表并对列表进行排序。如果要根据其他值进行排序,请使用FileInfo数据块检索文件信息,并根据这些值进行排序。

使用排序列表,然后使用Foreach迭代它。List<>保证提供一个迭代器,该迭代器按照插入的顺序返回列表中的项。

代码语言:javascript
复制
 public void GetOrderedFiles()
{
    // Get unsorted list of file names
    List<string> fileNames = System.IO.Directory.GetFiles(strPath);

    List<System.IO.FileInfo> fileInformationList = new List<System.IO.FileInfo>();
    // For each file name, get a full file information block 
    fileNames.ForEach(fileName => fileInformationList.Add(new System.IO.FileInfo(fileName)));
    // Order by CreationTime. Could be any FileInfo data item.
    IOrderedEnumerable<System.IO.FileInfo> sortedFileInformation = fileInformationList.OrderBy(item => item.CreationTime);

    // Iterate round the sorted collection
    foreach(System.IO.FileInfo fileInformation in sortedFileInformation)
    {
        System.IO.File.Copy(fileInformation.FullName, /* Destination file name */)
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-03-31 14:03:02

你需要先把它们排序

代码语言:javascript
复制
For Each filename As String In Directory.GetFiles(source)

将上线改为:

代码语言:javascript
复制
Dim filenames() as String
filenames = filenames.OrderBy(Function(f) f.CreationTime) //by time
filenames = filenames.OrderBy(Function(f) f) //alphabetical, not sure of that one
filenames = filenames.OrderBy(Function(f) New FileInfo(f).Length) // by size
    For Each filename As String In filenames
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36335521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档