2013-07-28 46 views
2

我需要檢查我的Windows應用程序,並瞭解它如何在具有慢磁盤的系統上運行。 我怎樣纔能有一個模擬緩慢的磁盤,Windows不緩存它的內容,所以我可以重複我的測試?如何模擬緩存和不讀緩存磁盤驅動器

更新:我有很多代碼訪問磁盤,無法創建新類以模擬慢速光盤,部分代碼是第三方&,沒有可訪問的源代碼。

更新2:我也需要減慢Directory.GetFiles()的速度。

回答

0

如果您確實有源代碼,您可以編寫一個模擬磁盤行爲的類,並將所有磁盤讀/寫代碼替換爲對您的類的調用。

您需要緩存由應用程序完成的請求,並在延遲後執行它們。

如果您無法訪問代碼,那麼您希望找到一個模擬慢速磁盤的驅動程序......如果存在這種情況。

2

你可以慢decoratorStream這將做部分(或全部)操作與延遲創建:

public class SlowStream : Stream 
{ 
    private Stream _stream; 
    private TimeSpan _delay; 

    public SlowStream(Stream stream, TimeSpan delay) 
    { 
     _stream = stream; 
     _delay = delay; 
    } 

    // implementation 
} 

在實現流會員,你應該直接委派一些操作,以裝飾流

public override bool CanRead 
{ 
    get { return _stream.CanRead; } 
} 

public override void Flush() 
{ 
    _stream.Flush(); 
} 

public override void Close() 
{ 
    _stream.Close(); 
} 

但是要延遲其他操作,你想慢一點:

public void Wait() 
{ 
    Thread.Sleep(_delay); 
} 

public override int Read(byte[] buffer, int offset, int count) 
{ 
    Wait(); 
    return _stream.Read(buffer, offset, count); 
} 

public override void Write(byte[] buffer, int offset, int count) 
{ 
    Wait(); 
    _stream.Write(buffer, offset, count); 
}  

用法:

using(var stream = File.Open(fileName, FileMode.Open)) 
{ 
    var slowStream = new SlowStream(stream, TimeSpan.FromSeconds(1)); 
    var reader = new StreamReader(slowStream); 
    string line; 
    while((line = reader.ReadLine()) != null) 
     Console.WriteLine(line); 
} 
0

謝謝謝爾蓋的回答,但是在某些情況下,它可能會用較少的代碼和沒有裝飾器來完成 - 只需從所需的Stream對象繼承並延遲覆蓋Read方法。這裏是樣本類,它足以滿足我在類似情況下的需求:

public class SlowStream : MemoryStream 
    { 
     private readonly TimeSpan _delay; 

     public SlowStream(byte[] buffer, TimeSpan delay) 
      : base(buffer) 
     { 
      _delay = delay; 
     } 

     public override int Read(byte[] buffer, int offset, int count) 
     { 
      Thread.Sleep(_delay); 
      return base.Read(buffer, offset, count); 
     } 
    }