C# 使用openXML检查文件大小

C# 使用openXML检查文件大小,c#,openxml,C#,Openxml,我正在使用openXML库读取excel文件。openXML提供了两种读取文件的方法 一次加载内存中的所有行 使用读卡器逐个加载行 第一种方法速度更快,因为一旦我在内存中有了所有行,我就可以使用Parallel.ForEach进行进一步处理,而这种方法有一个限制,即如果我在内存中加载大约100万行,那么我会得到System.OutOfMemory异常 第二种方法可以很好地处理大型数据文件,但速度较慢,因为它不允许并行迭代行 我想实现的功能是,根据用户上传的文件大小,代码将决定使用哪种方法 我的问

我正在使用openXML库读取excel文件。openXML提供了两种读取文件的方法

一次加载内存中的所有行 使用读卡器逐个加载行 第一种方法速度更快,因为一旦我在内存中有了所有行,我就可以使用Parallel.ForEach进行进一步处理,而这种方法有一个限制,即如果我在内存中加载大约100万行,那么我会得到System.OutOfMemory异常

第二种方法可以很好地处理大型数据文件,但速度较慢,因为它不允许并行迭代行

我想实现的功能是,根据用户上传的文件大小,代码将决定使用哪种方法

我的问题是如何使用openXML获得文件大小

如果您有任何其他方法来解决此问题,那么也请分享。

您可以在读取伪样式后使用并行处理每行,但应该给您一个提示:

int maxDegreeOfParallelism = THREAD_COUNT;
var processor = new ActionBlock<Row>(r => ProcessRow(r), new ExecutionDataflowBlockOptions
  {
     MaxDegreeOfParallelism = maxDegreeOfParallelism
  });
while (var row = reader.ReadRow())
    processor.Post(row);
然后,将逐个读取每一行,并由ProcessRow方法在另一个线程上并行处理,直到线程数为个线程。 注意:如果处理速度比读取速度慢,那么仍有可能在处理第一行之前读取所有行,而不再在内存中。如果是这种情况,您可以检查块的InputCount并等待其低于阈值,然后继续读取和发布行。

您可以在读取某些伪样式后使用并行处理每一行,但应给出如何执行的提示:

int maxDegreeOfParallelism = THREAD_COUNT;
var processor = new ActionBlock<Row>(r => ProcessRow(r), new ExecutionDataflowBlockOptions
  {
     MaxDegreeOfParallelism = maxDegreeOfParallelism
  });
while (var row = reader.ReadRow())
    processor.Post(row);
然后,将逐个读取每一行,并由ProcessRow方法在另一个线程上并行处理,直到线程数为个线程。
注意:如果处理速度比读取速度慢,那么仍有可能在处理第一行之前读取所有行,而不再在内存中。如果是这种情况,您可以检查块的InputCount并等待其低于阈值,然后继续读取和发布行。

您可以这样做,直接使用.NET System.IO获取文件大小


您可以直接使用.NET System.IO执行类似操作以获取文件大小


如果您对xlsx文件或任何OpenXML格式文件的未压缩大小感兴趣,您可以使用该类打开并检查其流长度。此代码将显示如何执行此操作:

long total;
using(var pack = Package.Open(@"c:\your\path\and\file.xlsx")) // also accepts a stream
{   
     total = (from pt in pack.GetParts()
                 select pt.GetStream().Length
              ).Sum();
}
Console.WriteLine("total uncompressed size {0}" ,total);

在我的测试中,它似乎没有读取内存中的整个文件来获得长度,但我只测试了30MB左右的文件

如果您对xlsx文件或任何OpenXML格式文件的未压缩大小感兴趣,您可以使用该类打开并检查其流长度。此代码将显示如何执行此操作:

long total;
using(var pack = Package.Open(@"c:\your\path\and\file.xlsx")) // also accepts a stream
{   
     total = (from pt in pack.GetParts()
                 select pt.GetStream().Length
              ).Sum();
}
Console.WriteLine("total uncompressed size {0}" ,total);

在我的测试中,它似乎没有读取内存中的整个文件来获得长度,但我只测试了30MB左右的文件

你为什么不能用C来获取文件大小?我没有找到任何可以获取文件大小的方法。如果你知道的话,请分享你为什么不能用C来获取文件大小?我没有找到任何可以获取文件大小的方法。如果你知道,那么请分享嗨,你的建议真的很好,但现在,另一个解决方案更适合我。谢谢,你的建议真的很好,但现在,另一个解决方案更适合我。谢谢