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

2 に答える 2

1

ファイルへの書き込み者が 1 人 (つまり、自分自身) であることが確実である限り、これは機能します。それ以上ですと、トラブルに巻き込まれる可能性があります。ただし、この制限に問題がない場合はFileStream、適切なFileShare列挙型で a を使用することを確認するだけです。で囲めば簡単です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がある場合、パフォーマンスのために、各レコードが最初に要求されたときにメモリ内の辞書にロードすると、パフォーマンスが大幅に向上します。コードは最初に辞書を調べ、辞書にない場合にのみファイルを読み取ります。

于 2012-12-04T22:26:52.293 に答える
-2

問題は、ASP.Net がマルチスレッドの複数同時ユーザー環境であることです。サーバーのファイルシステムはそうではありません。一方、データベースはそうです。

ファイルの内容を読み取るだけであれば問題ありません。Web プロセスを使用して同じファイルに書き込むことはできません。2 人のユーザーが試行するとすぐに、IOException が発生します。

于 2012-12-04T22:15:08.830 に答える