Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法在UWP(Windows 10应用程序)C中压缩空白文本文件(大小为0KB)_C#_Windows Runtime_Uwp_Windows 10 Universal - Fatal编程技术网

C# 无法在UWP(Windows 10应用程序)C中压缩空白文本文件(大小为0KB)

C# 无法在UWP(Windows 10应用程序)C中压缩空白文本文件(大小为0KB),c#,windows-runtime,uwp,windows-10-universal,C#,Windows Runtime,Uwp,Windows 10 Universal,我有一个UWP应用程序通用Windows平台。我正在尝试压缩文件夹及其内容子文件夹、图像、文本文件 如果文本文件不是空的,它工作得很好 但当任何文本文件为空白或0 KB大小为空时,它会给出一个例外 错误如下: {System.ArgumentException:指定的缓冲区索引不在缓冲区容量内。 位于System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.ToArrayIBuffer源,UInt32

我有一个UWP应用程序通用Windows平台。我正在尝试压缩文件夹及其内容子文件夹、图像、文本文件

如果文本文件不是空的,它工作得很好

但当任何文本文件为空白或0 KB大小为空时,它会给出一个例外

错误如下:

{System.ArgumentException:指定的缓冲区索引不在缓冲区容量内。 位于System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.ToArrayIBuffer源,UInt32源索引,Int32计数 位于System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.ToArrayBuffer源 在SmartflowRuntimes.Service.d__54.MoveNext -来自引发异常的上一个位置的堆栈结束跟踪-- 在System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccessTask任务中 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotificationTask任务中 在System.Runtime.CompilerServices.TaskAwaiter.GetResult 在SmartflowRuntimes.Service.d__54.MoveNext -来自引发异常的上一个位置的堆栈结束跟踪-- 在System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccessTask任务中 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotificationTask任务中 在System.Runtime.CompilerServices.TaskAwaiter.GetResult 在SmartflowRuntimes.Service.d_u53.MoveNext}

这是我的代码:

这个问题有解决办法吗?谢谢。

此System.ArgumentException是从WindowsRuntimeBufferExtensions.ToArray方法引发的,该方法要求IBuffer的大小大于0

因此,要解决这个问题,请在调用此方法之前检查文件大小,就像在调用对象引用的方法之前经常检查对象引用是否为null一样

ZipArchiveEntry readmeEntry = archive.CreateEntry(file.Path.Remove(0, baseDirPath.Length));

ulong fileSize = (await file.GetBasicPropertiesAsync()).Size;                
byte[] buffer = fileSize > 0 ? (await FileIO.ReadBufferAsync(file)).ToArray() 
                : new byte[0];

using (Stream entryStream = readmeEntry.Open())
{
    await entryStream.WriteAsync(buffer, 0, buffer.Length);                    
}
顺便说一下,WindowsRuntimeBufferExtensions.ToArray是一个,它允许您在IBuffer实例上调用不存在的ToArray方法,因此称为扩展方法。我还演示了如何以更方便的方式调用它

ZipArchiveEntry readmeEntry = archive.CreateEntry(file.Path.Remove(0, baseDirPath.Length));

ulong fileSize = (await file.GetBasicPropertiesAsync()).Size;                
byte[] buffer = fileSize > 0 ? (await FileIO.ReadBufferAsync(file)).ToArray() 
                : new byte[0];

using (Stream entryStream = readmeEntry.Open())
{
    await entryStream.WriteAsync(buffer, 0, buffer.Length);                    
}