网站潜在的文件锁定问题

时间:2012-12-04 22:07:58

标签: c#

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

该目录将包含ex:

文件列表

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

2 个答案:

答案 0 :(得分: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,那么如果您在第一次要求每条记录时将这些内容加载到内存中的字典中,您会更好地更多。您的代码首先会在字典中查找,如果字典没有,则只读取该文件。

答案 1 :(得分:-2)

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

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