0

これは基本的にWindows 8アプリ用で、この方法を使用してファイルを作成しています-

static async void WriteDataCords(int numDataCodewords)
  {
      StorageFolder storageFolder = KnownFolders.DocumentsLibrary;

      var storageFile = await storageFolder.GetFileAsync("DataCodeWords.txt");
      string data = numDataCodewords.ToString();
      await FileIO.AppendTextAsync(storageFile, data);
  }  

そして今、私はこの方法を使ってファイルを読んでいます -

        StorageFolder storageFolder7 = KnownFolders.DocumentsLibrary;
        var storageFile7 = await storageFolder6.GetFileAsync("DataCodeWords.txt");
        string text7 = await Windows.Storage.FileIO.ReadTextAsync(storageFile7);

しかし、このプログラムを実行すると、「アクセスが拒否されたか、ファイルにアクセスできません」というエラーがスローされます。このアプローチを使用して、私は多くのファイルを書き込んで読んでいます。この問題を解決する方法を教えてください。前もって感謝します

私の問題は、ファイルにアクセスして読み取りと表示を行っているときに、ファイルが書き込みプロセスに関与しているため、そのファイルにアクセスできず、エラーが表示されることです。そう。ファイルの書き込みプロセスが完了し、読み取りプロセスが開始されたときにのみ先に進むアプローチはありますか?

4

1 に答える 1

1

SemaphoreSlimリソースにアクセスできるスレッドの数を制限する which を使用できます。以下は、ファイルの書き込み/読み取りを処理するクラスの例です。ファイルを書きたいときにインスタンスを作成し、WriteDataCords メソッドを呼び出します。次に、ReadDataCords を読み取ってから呼び出すときに、正しいインスタンスにアクセスする方法が必要です。

public class FileReadWrite
{
    public string FileName { get; set; }

    public FileReadWrite(string fileName)
    {
        FileName = fileName;
    }

    private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
    public async Task WriteDataCords(int numDataCodewords)
    {
        await _semaphore.WaitAsync();
        try
        {
            StorageFolder storageFolder = KnownFolders.DocumentsLibrary;
            var storageFile = await storageFolder.GetFileAsync(FileName);
            string data = numDataCodewords.ToString();
            await FileIO.AppendTextAsync(storageFile, data);
        }
        finally
        {
            _semaphore.Release();
        }
    }
    public async Task ReadDataCords()
    {
        await _semaphore.WaitAsync();
        try
        {
            StorageFolder storageFolder6 = KnownFolders.DocumentsLibrary;
            var storageFile7 = await storageFolder6.GetFileAsync(FileName);
            string text7 = await Windows.Storage.FileIO.ReadTextAsync(storageFile7);
        }
        finally
        {
            _semaphore.Release();
        }
    }
}

そして呼び出しコード:

public class ClientCode
{
    public async void WriteFile()
    {
        var fileReadWrite = new FileReadWrite("DataCodeWords.txt");
        await fileReadWrite.WriteDataCords(42);
    }

    public async void ReadFile()
    {
        var fileReadWrite = GetFileReadWriteForFile("DataCodeWords.txt"); //Method for retreiving correct instance of FileWriteRead class
        await fileReadWrite.ReadDataCords();
    }

    private FileReadWrite GetFileReadWriteForFile(string fileName)
    {

    }
}

FileWriteRead クラスをスキップして (複雑さが増します)、SemaphoreSlim を元のコードで直接使用して書き込み/読み取りを行うこともできますが、一度に 1 つのファイルしか書き込み/読み取りできません (これは問題にならない可能性があります)。

于 2013-07-25T21:40:04.537 に答える