c# - .Net 中的文件操作是否有异步替代方案?

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

我在 .Net 4.5 中使用 C#。所以我可以使用 .Net 4.5/的异步/等待功能但是我没有找到 File.CopyFile.MoveDirectory 的异步方法.GetFiles 等在 System.IO 中。

最佳答案

有很多方法可以做到这一点。 看看我从 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

关于c# - .Net 中的文件操作是否有异步替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20049428/

相关文章:

c# - 使用 shim 和 fakes 单元测试 Entity Framework 不会返回 100% 覆盖率?

c# - 正确转换为枚举

c# - ObjectContext 正在泄漏分离实体的内存

.net - 以与 NSWindow 相同的方式显示 WPF 模式窗口/对话框/面板,可以像 Cocoa 中的工作表一样显示

c# - 在 Windows 8 应用程序中从导航堆栈弹出页面

wpf - async-await 似乎使用了 UI 线程

c# - 将 Json 对象转换为 DataTable

c# - 谁能用 C# 中的带符号 float 解释这种奇怪的行为?

c# - 使用 System.Threading.Thread 时 WPF 应用程序崩溃

c# - WPF MVVM 如何使用 ShowDialog() 上的绑定(bind)预填充文本框?