C# 网站潜在的文件锁定问题

C# 网站潜在的文件锁定问题,c#,C#,我正在写一个博客,我把文本文档上传到一个包含HTML的目录中。使用下面的代码,您是否预期我会有任何文件锁定问题或其他我没有看到的问题?我最关心的是文件.ReadAllText() 该目录将包含文件列表,例如: 20101_2300.txt 20120201_0100.txt 等等 public class Website { private string directory = "C:\\Web"; public List<BlogEntry> GetArchives

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

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

20101_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); }
    }
}
公共类网站
{
私有字符串目录=“C:\\Web”;
公共档案目录
{
返回文件(“”);
}
公共列表GetArchives(字符串日期)
{
var files=!string.IsNullOrEmpty(date)?Directory.GetFiles(Directory,“*.txt”)。其中(t=>t.Contains(date)):Directory.GetFiles(“C:\\Web”,“*.txt”);
var sb=files.Select(file=>newblogentry{FullPath=file}).ToList();
返回sb.OrderByDescending(t=>t.FileDate).Skip(5.ToList();
}
公共列表getrecented()
{
var files=Directory.GetFiles(目录“*.txt”);
var sb=files.Select(file=>newblogentry{FullPath=file}).ToList();
返回sb.OrderByDescending(t=>t.FileDate).Take(5.ToList();
}
}
公共类博客条目
{
公共字符串完整路径{get;set;}
公共日期时间文件日期
{
获取{return DateTime.ParseExact(Path.GetFileNameWithoutExtension(FullPath),“yyyyMMdd_HHmm”,CultureInfo.InvariantCulture);}
}
公共字符串文件内容
{
获取{return File.ReadAllText(完整路径);}
}
}

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


如果您只读取文件内容,则没有问题。您不能使用web进程写入同一个文件。只要您确定一个文件只有一个写入程序(即:您自己),只要有两个用户尝试,就会出现IOException。不仅如此,你还可能陷入麻烦。但是,如果您同意此限制,那么您需要做的就是确保使用具有适当枚举的。如果你把它包在一个盒子里,那就很容易了

按如下方式编写属性:

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,那么如果您在第一次请求每条记录时将其加载到内存中的字典中,您会做得更好。您的代码将首先查看字典,只有在字典没有的情况下才读取文件。

我基本上希望在C#MVC网站上维护一个博客,尽可能少的代码,而不使用数据库。文件系统绝对是为多个并发用户设计的,其他任何东西都是荒谬的(想想在任何给定的时间有多少不同的用户在服务器上运行,即使只是在HTTP和DB进程运行的情况下)。类似地,数据库可以并且经常以阻止大量并发的方式锁定。这个答案根本无助于解决OP的问题。好的,在记事本中打开一个文本文件。然后在另一个记事本中打开它。在两个记事本中都进行更改。保存两个。观察竞争条件。现在,编写一个控制台应用程序,尝试在两个记事本中打开相同的文件用于写入的应用程序。请注意文件系统无法处理并发性这一事实。您的HTTP和DB进程示例非常荒谬。仅仅因为一台计算机上有多个用户,并不意味着他们都可以同时编辑文件系统上的同一个文件。想象一下,如果您的web进程没有序列化写入其自己的请求日志。想象一下如果您的数据库进程允许多个用户在不序列化的情况下修改数据表!银行不希望这样。数据库必须序列化事务。这是他们的工作。Web服务器不能允许多个用户写入一个文本文件。数据库不序列化事务。它们提供ACID事务行为。Matt,我不打算这样做正在修改文件,只是将其上载到服务器。我所担心的是多个并发读取。谢谢。非常好,谢谢。我将不时地用FTP发送文本文件,我不会打开或写入任何现有文件。只是出于好奇,我是否会对Directory.GetFiles()有任何问题?