0

我正在写一个博客,我将文本文档上传到包含 HTML 的目录。使用下面的代码,您是否预计我会遇到文件锁定问题或其他我没有看到的问题?我最关心的是 File.ReadAllText()。

该目录将包含一个文件列表,例如:

20120101_2300.txt

20120201_0100.txt

ETC...

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); }
    }
}
4

2 回答 2

1

只要您确定文件只有一个写入者(即:您自己),这可以工作。不仅如此,你很可能会遇到麻烦。但是,如果您同意此限制,您需要做的就是确保将 aFileStream与适当的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();
       }

    }
}

为了提高性能,如果您的服务器有内存,那么在第一次请求每条记录时将它们加载到内存中的字典中,您会希望做得更好您的代码将首先在字典中查找,并且仅在字典没有文件时才读取该文件。

于 2012-12-04T22:26:52.293 回答
-2

问题是 ASP.Net 是一个多线程、多并发的用户环境。服务器的文件系统不是。另一方面是数据库。

如果您只是读取文件内容,则没有问题。您只是不能使用您的 Web 进程写入同一个文件。只要两个用户尝试,您就会有 IOException

于 2012-12-04T22:15:08.830 回答