2014-01-16 97 views
0

我得到了我的實習,基本上是這樣的(一切都是用C#進行,在Visual Studio 2013)的分配:如何將「虛擬數據」寫入二進制文件?

  1. 創建新的二進制文件(特定的文件夾)
  2. 空/刪除文件,如果它已經存在
  3. 標記開始時間(毫秒精度)
  4. 將10 GB的虛擬數據寫入文件,儘可能快。 (寫數據的1024字節的虛擬數據塊,繼續直到10 GB的已被寫入)
  5. 馬克結束時間(精確到毫秒)
  6. 沖洗並關閉文件
  7. 輸出花了編寫所有10時GB數據(結束時間 - 開始時間)
  8. 輸出每秒字節數。

可能的輸入參數必須是:

  • 文件夾
  • 總字節數(例如10GB)每塊
  • 字節(如1024)

現在我不是真正感興趣的僅僅是獲得這樣的代碼,因爲這不會教我什麼。我有興趣瞭解這是如何完成的,理解它,所以我可以自己做。

請注意,我知道這不是一個網站,只是爲了讓有人做你的任務 - 但也明白,我非常有興趣瞭解這一點,我不知道其他地方(除了我的導師,但我不想每20分鐘問他一些東西:P)

有人可以解釋,或者可能重定向我的某個地方嗎?也許只是給我一個提示,告訴我們它是如何完成的? 我一直在做C#約2周,但我從來沒有寫過任何創建文件等。

+1

作業的哪一部分是你遇到的麻煩?創建文件?寫入文件?生成虛擬數據?獲取當前時間? – OnlyThenDidIReckonMyCurse

+0

那麼現在哪個*部分*造成問題了?你已經把這個項目分成了8個任務 - 你有多少這些任務? –

+1

您是否嘗試過設置文件的大小/長度? –

回答

1

Create new binary file (specific folder)

...

Flush and close file

C#使用的概念進行二進制輸入/輸出。

強制性文獻:http://msdn.microsoft.com/en-us/library/k3352a4t(v=vs.110).aspx

這兩種技術上演示MSDN。

Empty/delete file, if it already exists

嗯,其實,你只需要檢查文件是否存在,如果你希望將其覆蓋。

Mark start-time (millisecond precision)

...

Mark end-time (millisecond precision)

...

Output the time it took to write all 10 GB of data (end time - start time)

Output number of bytes per second.

環顧System.Diagnostics命名空間。

Write 10 GB of dummy data into file, as fast as possible. (Write data as chunks of 1024 byte dummy data, continue untill 10 GB has been written)

最後,程序的肉......


劇透!


你必須寫一個循環,在每次迭代寫1024個字節,直到寫入的字節總和達到10GB。

下面是一個代碼示例,但沒有錯誤檢查(因爲它不是要求)。在現實世界中,你顯然也會編寫處理異常的代碼。

using (var fileStream = File.OpenWrite(path)) 
{ 
    double fileSize = Math.Pow(10, 10); // 10 GB 
    int bufferSize = 1024; // 1KB 
    byte[] buffer = new byte[bufferSize]; // Create an array of zero's 

    for (int written = 0; written < fileSize; written += bufferSize) 
    { 
     // Write 1024 bytes (all zero's: 000000000000...0) 
     fileStream.Write(
      array: buffer, 
      offset: 0, 
      count: bufferSize); 
    } 
    /* Optional inside a "using" block: */ fileStream.Flush(); 
} 
+0

OP明確不想完成解決方案:P – Luaan

+0

我知道。我只是忍不住自己。公平地說,我確實添加了一個擾流警報。 –

+1

:))哦,並且不要在for循環的每次迭代時刷新。如果需要的話,你應該只顯式刷新,否則你會試圖繞過.NET和操作系統嘗試使用的各種優化。對於在寫入之間沒有「暫停」的順序寫入,它只會使性能變差(平均有點差一些,但在某些情況下,例如寫入* ehm *軟盤驅動器或網絡共享時,它可能很重要) 。沖洗只會在最後被需要,但無論如何'Dispose'會處理,所以即使這樣也不需要。如果你不忘記'Dispose' ... – Luaan

0

看看System.IO.File。您想創建一個文件流(靜態File.Create),然後在using子句中,您將使用Stream.Write通過該流寫入數據。我不會添加更多內容,你可以在MSDN上找到足夠的信息,但如果需要的話,隨時提出任何問題。

此外,要挑選,Mark start-time (millisecond precision)將是非常棘手的,因爲系統日期不會保證你那種精度。所以你可以打印出毫秒數,但不會精確到到毫秒。有一個專門的測量時間間隔的類,找到它並使用它:)

+0

謝謝。我之前從未使用過File.Create,「using」或「Stream.Write」,所以這就是爲什麼我不知道如何處理這個任務。我會去做一些關於這些的研究。 – JFBN

0

看看下面讓你開始:

  • System.IO.FileStream
  • System.IO.FileMode
  • System.Random
  • System.Diagnostics.Stopwatch
  • 系統.TimeSpan