Is it possible to get the size of a file in C# without using System.IO.FileInfo
at all?
I know that you can get other things like Name and Extension by using Path.GetFileName(yourFilePath)
and Path.GetExtension(yourFilePath)
respectively, but apparently not file size? Is there another way I can get file size without using System.IO.FileInfo
?
The only reason for this is that, if I'm correct, FileInfo grabs more info than I really need, therefore it takes longer to gather all those FileInfo's if the only thing I need is the size of the file. Is there a faster way?
Not a direct answer...because I am not sure there is a faster way using the .NET framework.
Here's the code I am using:
Running that, it took 2709ms to run on my "Program Files" directory, which was around 22720 files. That's no slouch by any means. Furthermore, when I put
*.txt
as a filter for the first parameter of theGetFiles
method, it cut the time down drastically to 461ms.A lot of this will depend on how fast your hard drive is, but I really don't think that FileInfo is killing performance.
NOTE: I thikn this only valid for .NET 4+
You can try this:
But that's not much of an improvement...
Here's the example code taken from pinvoke.net:
From a short test i did, i've found that using a FileStream is just 1 millisecond slower in average than using Pete's GetFileSizeB (took me about 21 milliseconds over a network share...). Personally i prefer staying within the BCL limits whenever i can.
The code is simple:
As per this comment:
Since you're finding the length of so many files you're much more likely to benefit from parallelization than from trying to get the file size through another method. The
FileInfo
class should be good enough, and any improvements are likely to be small.Parallelizing the file size requests, on the other hand, has the potential for significant improvements in speed. (Note that the degree of improvement will be largely based on your disk drive, not your processor, so results can vary greatly.)
I performed a benchmark using these two methods:
Running against a bit over 2300 files, GetFileSizeA took 62-63ms to run. GetFileSizeB took over 18 seconds.
Unless someone sees something I'm doing wrong, I think the answer is clear as to which method is faster.
Is there a way I can refrain from actually opening the file?
Update
Changing FileAttributes.ReadOnly to FileAttributes.Normal reduced the timing so that the two methods were identical in performance.
Furthermore, if you skip the CloseHandle() call, the GetFileSizeEx method becomes about 20-30% faster, though I don't know that I'd recommend that.