C# 在Windows运行时复制大文件时获取HRESULT E_失败错误

C# 在Windows运行时复制大文件时获取HRESULT E_失败错误,c#,windows-runtime,windows-phone,windows-store-apps,windows-phone-8.1,C#,Windows Runtime,Windows Phone,Windows Store Apps,Windows Phone 8.1,当我尝试复制一个大文件(~500 MB)时,会收到此错误消息: 调用COM组件时返回错误HRESULT E_FAIL。 HResult:-2147467259 这是我用来复制文件的代码: await file.CopyAsync(storageFolder, name, NameCollisionOption.GenerateUniqueName); 多亏了它背后的开发人员,它的信息量不大 那么如何解决这个问题呢?谢谢 (我正在Windows Phone 8.1中测试它)我使用1.5 GB的文

当我尝试复制一个大文件(~500 MB)时,会收到此错误消息:

调用COM组件时返回错误HRESULT E_FAIL。 HResult:-2147467259

这是我用来复制文件的代码:

await file.CopyAsync(storageFolder, name, NameCollisionOption.GenerateUniqueName);
多亏了它背后的开发人员,它的信息量不大

那么如何解决这个问题呢?谢谢


(我正在Windows Phone 8.1中测试它)

我使用1.5 GB的文件进行了测试,并且能够复制异常。手动设置内部缓冲区大小似乎可以解决这个问题,但请注意这会对应用程序产生怎样的影响

CreateNewFileAsync()方法只创建一个新文件:)

祝你好运和快乐

    var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
var file = await folder.GetFileAsync("largeFile.txt");

StorageFolder tempFolder = ApplicationData.Current.TemporaryFolder;

// Exception
if (file != null)
{
    StorageFile copiedFile = await file.CopyAsync(tempFolder, "copied.txt", NameCollisionOption.GenerateUniqueName);
}


// Setting the internal buffer to 1024 
// Be aware- from MSDN: However, this buffer is allocated on the large object heap 
// and could potentially degrade garbage collection performance. 
// You should only use large buffer sizes if it will noticeably improve the performance of your app.
var newFile = await CreateNewFileAsync();

using (Stream ss = await file.OpenStreamForReadAsync())
using (Stream sd = await newFile.OpenStreamForWriteAsync())
{
    await ss.CopyToAsync(sd, 1024);
    var fileProps = await file.GetBasicPropertiesAsync();
    var size = fileProps.Size;
}

答案可以在这里找到:您需要缓冲区这两种方法都使用缓冲区,CopyToAsync只允许我们设置内部缓冲区大小。TBH我不确定为什么缓冲区大小在其默认值(我相信大约为20KB,但不确定)和方法是异步的情况下引发异常。我会小心地将内部缓冲区设置得太高。因此,通过这种方式,我们创建一个新文件并复制流。我不确定文件的属性和元数据是否也会保留,我会检查一下。谢谢。我只是用元数据设置了一个断点,并确认所有内容都被复制了——如果不需要的话,请删除它。您需要将文件复制到另一个文件中,对于这样大小的文件,我不想将其全部保存在内存中。上面代码中的第二种方法与第一种方法相同,不同之处在于内部缓冲区大小发生了更改。谢谢。据我所知,StorageFile只是一个指向实际文件的指针,所以内存中没有大文件。CopySync()方法失败的原因尚不清楚。谢谢你的帮助,这很有效。