是否有.Net中的文件操作的异步替代?

时间:2013-11-18 13:49:26

标签: c# .net wpf file-io async-await

我正在使用c#和.Net 4.5。所以我可以使用.Net 4.5的async / await功能。但是我没有在File.Copy中找到File.MoveDirectory.GetFilesSystem.IO等的异步方法。 / p>

3 个答案:

答案 0 :(得分:3)

有很多方法可以做到这一点。 看看我从msdn。

为你复制的这个例子

您可以使用FileStream和CopyToAsync:

来实现
using System;
using System.Threading.Tasks;
using System.Windows;
using System.IO;

namespace WpfApplication
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            string StartDirectory = @"c:\Users\exampleuser\start";
            string EndDirectory = @"c:\Users\exampleuser\end";

            foreach (string filename in Directory.EnumerateFiles(StartDirectory))
            {
                using (FileStream SourceStream = File.Open(filename, FileMode.Open))
                {
                    using (FileStream DestinationStream = File.Create(EndDirectory + filename.Substring(filename.LastIndexOf('\\'))))
                    {
                        await SourceStream.CopyToAsync(DestinationStream);
                    }
                }
            }
        }
    }
}

或者通过使用StreamReader和StreamWriter对象异步读取和写入文件的内容。

private async void Button_Click(object sender, RoutedEventArgs e)
{
    string UserDirectory = @"c:\Users\exampleuser\";

    using (StreamReader SourceReader = File.OpenText(UserDirectory + "BigFile.txt"))
    {
        using (StreamWriter DestinationWriter = File.CreateText(UserDirectory + "CopiedFile.txt"))
        {
            await CopyFilesAsync(SourceReader, DestinationWriter);
        }
    }
}

public async Task CopyFilesAsync(StreamReader Source, StreamWriter Destination) 
{ 
    char[] buffer = new char[0x1000]; 
    int numRead; 
    while ((numRead = await Source.ReadAsync(buffer, 0, buffer.Length)) != 0) 
    {
        await Destination.WriteAsync(buffer, 0, numRead);
    } 
} 

更多信息: http://msdn.microsoft.com/en-us/library/kztecsys(v=vs.110).aspx

答案 1 :(得分:2)

不,async / Copy /等等没有Move个等价物。如有必要,您可以自己构建它们。

GetFiles有点不同。有EnumerateFiles响应更快(但实际上不是async)。

答案 2 :(得分:2)

对于复制,您可以使用Stream.CopyToAsync方法。在Task.Run

中,您可以将调用包装到相应的方法中