2012-12-04 59 views
0

我正在寫一個博客,我上傳文本文件到一個包含HTML的目錄。使用下面的代碼,你是否預計我會遇到文件鎖定或其他問題,我沒有看到任何問題?我最關心的是File.ReadAllText()。網站潛在的文件鎖定問題

該目錄將包含的文件前的列表:

20120101_2300.txt

20120201_0100.txt

等等

public class Website 
{ 
    private string directory = "C:\\Web"; 
    public List<BlogEntry> GetArchives() 
    { 
     return GetArchives(""); 
    } 

    public List<BlogEntry> GetArchives(string date) 
    { 
     var files = !string.IsNullOrEmpty(date) ? Directory.GetFiles(directory, "*.txt").Where(t => t.Contains(date)) : Directory.GetFiles("C:\\Web", "*.txt"); 
     var sb = files.Select(file => new BlogEntry {FullPath = file}).ToList(); 
     return sb.OrderByDescending(t => t.FileDate).Skip(5).ToList(); 
    } 

    public List<BlogEntry> GetRecent() 
    { 
     var files = Directory.GetFiles(directory, "*.txt"); 
     var sb = files.Select(file => new BlogEntry {FullPath = file}).ToList(); 
     return sb.OrderByDescending(t => t.FileDate).Take(5).ToList(); 
    } 
} 

public class BlogEntry 
{ 
    public string FullPath { get; set; } 

    public DateTime FileDate 
    { 
     get { return DateTime.ParseExact(Path.GetFileNameWithoutExtension(FullPath), "yyyyMMdd_HHmm", CultureInfo.InvariantCulture); } 
    } 

    public string FileContents 
    { 
     get { return File.ReadAllText(FullPath); } 
    } 
} 
+0

我基本上是想在C#MVC網站上用盡可能少的代碼來維護一個不使用數據庫的代碼。 – Cyberdrew

回答

1

只要你確定文件只有一個作者(即:你自己),這可以工作。更重要的是,你很可能會陷入困境。如果您對此限制還可以,但您只需確保使用FileStream並使用適當的FileShare枚舉即可。如果你將它包裝在StreamReader中,這很容易。

寫這樣的特性:

public string FileContents 
{ 
    get { 
     using (var fs = new FileStream(FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
     using (var rdr = new StreamReader(fs)) 
     { 
      return rdr.ReadToEnd(); 
     } 

    } 
} 

出於性能考慮,如果您的服務器具有的RAM,你會喜歡做如果這些加載到字典中記憶中第一次每個記錄好被要求。您的代碼將首先在字典中查找,如果字典沒有它,則只能讀取該文件。

+0

非常好,謝謝。我將不時向FTP文本文件上傳,我不會打開或寫入任何現有文件。出於好奇,我會對Directory.GetFiles()有任何問題嗎? – Cyberdrew

-2

的問題是ASP.Net是一個多線程,多個併發用戶環境。服務器的文件系統不是。另一方面是數據庫。

如果你只是在閱讀文件內容,你沒有問題。你只是不能使用你的web進程寫入同一個文件。只要兩個用戶嘗試,你將有一個IOException

+2

文件系統絕對適用於多個併發用戶,其他任何情況都是荒謬的(想想在任何給定時間有多少不同的用戶在服務器上運行,即使HTTP和數據庫進程正在運行也是如此)。同樣,數據庫可以並且通常以阻止大量併發的方式被鎖定。這個答案根本無助於解決OP的問題。 – ssube

+0

好的,打開記事本中的文本文件。然後在另一個記事本中打開它。在兩者中進行更改。保存兩個。觀察比賽情況。現在,編寫一個控制檯應用程序,嘗試在兩個應用程序中打開相同的文件進行編寫。觀察文件系統無法處理併發的事實。 –

+0

你的HTTP和DB進程的例子很荒謬。僅僅因爲我們在一臺機器上有多個用戶並不意味着他們可以同時編輯文件系統上的同一個文件。想象一下,如果您的Web進程沒有將寫入序列化到自己的請求日誌中。想象一下,如果你的數據庫進程允許多個用戶在沒有序列化的情況下修改數據表!銀行不會喜歡這個。數據庫必須序列化事務。這是他們的工作。 Web服務器不允許許多用戶寫入一個文本文件。 –