2012-02-07 78 views
21

我正在使用fs.Length,其中fsFileStream讀取文件長度最快的方法C#

這是一個O(1)操作?我認爲這只是從文件的屬性中讀取,而不是通過文件來查找查找位置何時達到結尾。我試圖找到的文件的長度可以很容易地從1 MB到4-5 GB的範圍。

但是我注意到有一個FileInfo類,它也有一個Length屬性。

這兩個Length屬性在理論上是否需要相同的時間?或者是fs.Length較慢,因爲它必須首先打開FileStream

回答

30

.NET中獲取文件大小的自然方法是您提到的FileInfo.Length屬性。

我不知道Stream.Length較慢(它不會去讀整個文件反正),但它肯定更自然的使用FileInfo代替FileStream的,如果你不打算讀取該文件。


這裏有一個小的基準,它會提供一些數值:

private static void Main(string[] args) 
{ 
    string filePath = ...; // Path to 2.5 GB file here 

    Stopwatch z1 = new Stopwatch(); 
    Stopwatch z2 = new Stopwatch(); 

    int count = 10000; 

    z1.Start(); 
    for (int i = 0; i < count; i++) 
    { 
     long length; 
     using (Stream stream = new FileStream(filePath, FileMode.Open)) 
     { 
      length = stream.Length; 
     } 
    } 

    z1.Stop(); 

    z2.Start(); 
    for (int i = 0; i < count; i++) 
    { 
     long length = new FileInfo(filePath).Length; 
    } 

    z2.Stop(); 

    Console.WriteLine(string.Format("Stream: {0}", z1.ElapsedMilliseconds)); 
    Console.WriteLine(string.Format("FileInfo: {0}", z2.ElapsedMilliseconds)); 

    Console.ReadKey(); 
} 

結果

Stream: 886 
FileInfo: 727 
+0

邪惡,感謝您的時間信息! – jpints14 2012-02-07 15:29:42

+1

以這種方式進行基準測試可能不是測試差異的最有效方法(如果有的話)。我認爲磁盤緩存/操作系統因素將在保持時間下降方面發揮重要作用。 – PaulG 2012-02-07 16:05:41

+0

@PaulG你是如此的正確。標杆管理**總是**比看起來更復雜。上面的簡單基準**僅給出關於實際結果的一些指示。因爲它不會返回100000比250,所以我認爲有可能得出這樣的結論:兩種方法都沒有太大差別(就計算時間而言)。 – ken2k 2012-02-07 16:13:50

23

兩者都將訪問文件系統元數據,而不是讀取整個文件。我不知道哪個更有效率,作爲一個經驗法則我會說,如果你只有想知道長度(和其他元數據),使用FileInfo - 而如果你打開文件作爲無論如何,請使用FileStream.Length

+0

謝謝飛碟雙向先生! – jpints14 2012-02-07 15:17:15

相關問題