Windows phone 8.1 复制大文件时,如何避免StorageFile.CopySync()引发异常?

Windows phone 8.1 复制大文件时,如何避免StorageFile.CopySync()引发异常?,windows-phone-8.1,Windows Phone 8.1,我将通过StorageFile.copyanc()方法将一些文件从视频库复制到我的应用程序存储中,但如果文件大小超过1GB,则会引发如下异常: 类型:System.Runtime.InteropServices.COMException消息:错误 对COM组件的调用返回了HRESULT E_FAIL。 Stacktrace:在 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.

我将通过
StorageFile.copyanc()
方法将一些文件从视频库复制到我的应用程序存储中,但如果文件大小超过1GB,则会引发如下异常:

类型:System.Runtime.InteropServices.COMException消息:错误 对COM组件的调用返回了HRESULT E_FAIL。 Stacktrace:在 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()中


如何导入大文件,是否有解决方案?

我会尝试通过缓冲区复制它-例如:

private async Task CopyBigFile(StorageFile fileSource, StorageFile fileDest, CancellationToken ct)
{
   using (Stream streamSource = await fileSource.OpenStreamForReadAsync())
   using (Stream streamDest = await fileDest.OpenStreamForWriteAsync())
       await streamSource.CopyToAsync(streamDest, 1024, ct);
   return;
}

我写了一个扩展方法,它解决了我的问题,您可以在需要时参考它,如下所示:

public static class FileExtentions
{
    #region Fields
    private static readonly ulong MaxBufferSize = 16 * 1024 * 1024;
    #endregion // Fields

    #region Methods
    public static async Task<StorageFile> CopyAsync(this StorageFile self, StorageFolder desiredFolder, string desiredNewName, CreationCollisionOption option)
    {
        StorageFile desiredFile = await desiredFolder.CreateFileAsync(desiredNewName, option);
        StorageStreamTransaction desiredTransaction = await desiredFile.OpenTransactedWriteAsync();
        BasicProperties props = await self.GetBasicPropertiesAsync();
        IInputStream stream = await self.OpenSequentialReadAsync();

        ulong copiedSize = 0L;
        while (copiedSize < props.Size)
        {
            ulong bufferSize = (props.Size - copiedSize) >= MaxBufferSize ? MaxBufferSize : props.Size - copiedSize;
            IBuffer buffer = BytesToBuffer(new byte[bufferSize]);
            await stream.ReadAsync(buffer, (uint)bufferSize, InputStreamOptions.None);
            await desiredTransaction.Stream.GetOutputStreamAt(copiedSize).WriteAsync(buffer);
            buffer = null;
            copiedSize += (bufferSize);

            Debug.WriteLine(DeviceStatus.ApplicationCurrentMemoryUsage);
        }

        await desiredTransaction.CommitAsync();

        return desiredFile;
    }

    private static IBuffer BytesToBuffer(byte[] bytes)
    {
        using (var dataWriter = new DataWriter())
        {
            dataWriter.WriteBytes(bytes);
            return dataWriter.DetachBuffer();
        }
    }
    #endregion // Methods
公共静态类文件扩展名
{
#区域字段
私有静态只读ulong MaxBufferSize=16*1024*1024;
#endregion//字段
#区域方法
公共静态异步任务CopySync(此StorageFile自身、StorageFolder desiredFolder、string desiredNewName、CreationCollisionOption选项)
{
StorageFile desiredFile=Wait desiredFolder.CreateFileAsync(desiredNewName,选项);
StorageStreamTransaction desiredTransaction=等待desiredFile.OpenTransactiveWriteAsync();
BasicProperties props=等待self.getBasicProperties异步();
IIInputStream=等待self.OpenSequentialReadAsync();
ulong copiedSize=0升;
while(复制尺寸<道具尺寸)
{
ulong bufferSize=(props.Size-copiedSize)>=MaxBufferSize?MaxBufferSize:props.Size-copiedSize;
IBuffer buffer=BytesToBuffer(新字节[bufferSize]);
wait stream.ReadAsync(buffer,(uint)bufferSize,InputStreamOptions.None);
等待所需的Transaction.Stream.GetOutputStreamAt(copiedSize.WriteAsync(缓冲区);
缓冲区=空;
copiedSize+=(缓冲区大小);
Debug.WriteLine(DeviceStatus.ApplicationCurrentMemorySage);
}
等待所需的交易。CommitAsync();
返回所需文件;
}
专用静态IBuffer BytesToBuffer(字节[]字节)
{
使用(var dataWriter=newdatawriter())
{
dataWriter.WriteBytes(字节);
返回dataWriter.DetachBuffer();
}
}
#endregion//方法

CopyToAsync
有通过缓冲区执行的选项:
streamDest.CopyToAsync(destStream,1024)
-您尝试过这样做吗?它是否也会引发异常?在那里添加CancellationToken也很合适。谢谢,Romasz!根据您的建议,我编写了一个扩展方法,我的问题消失了。好的,缓冲区解决了问题。您能检查一下更简单的方法(如上)吗也可以解决这个问题吗?我试过上面的代码,它也很好地工作。:)有完全相同的问题,但我的文件只有13MB-这解决了它!