UWP FileIO已被另一个进程使用,且文本文件超过20,000KB

时间:2018-08-27 18:39:12

标签: c# file-io uwp windows-10

我对FileIO有问题。它继续错误提示“正在由另一个进程使用”。下面是它的图片。

another process use it, so a process can't access

因此,经过大量调试..我发现“ await FileIo.AppendTextAsync()”部分存在问题。下面是它的捕获。如果进行缩放,则在右下角会看到错误的try-catch。 System.IO.FileLoadException

为解决此问题,我使用信号量来确保一个进程可以访问FileIO-即使原始源也只能确保一个进程FileIO.-但这没有用。再次出错(被另一个进程使用)

下面是我的源代码。

    public async Task<List<string>> DoRandom(FileLists fl, StorageFolder folder, StorageFile another_file, int k)
   {
        FileLists retLists = new FileLists();
        List<string> encodingList = new List<string>();

        if (Option1)
        {
            foreach (UploadedFile i in fl)
            {
                await i.setOutFile(folder); // wait until setOutFile ends
                // read stream from storagefile
                using (Stream s = await i.originFile.OpenStreamForReadAsync())
                {
                    // streamreader from stream
                    using (StreamReader sr = new StreamReader(s))
                    {

                        string str = await sr.ReadToEndAsync();
                        StringBuilder stringBuilder = new StringBuilder(str);

                        string[] vs =
                            str.Split(new string[] { "\n", "\r\n", "\r" }, StringSplitOptions.None); 

                        foreach (var j in vs)
                        {
                           // try
                            {
                                await FileIO.AppendTextAsync(i.outputFile, j); // <--- real Problem Point
                            }
                            //catch { }
                        }
                    }
                }
            }
        }

DoRandom函数由下面的函数调用。

  private async void StartButton_Click(object sender, RoutedEventArgs e)
    {

        /** non important source is omitted **/
        var picker = new Windows.Storage.Pickers.FolderPicker();

        picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Desktop;
        picker.FileTypeFilter.Add("*");

        StorageFolder folder = await picker.PickSingleFolderAsync();

        if (folder != null)
        {
            await myRandomizer.DoRandom(uploadedFileLists, folder, another_file, k);
            /*
            foreach (string str in fileEncoding)
            {
                var messageDialog = new MessageDialog(str);
                messageDialog.Title = str;
                await messageDialog.ShowAsync();
            }
            */
        }

    }
}

我真的很沮丧,因为我不明白我的消息来源有什么问题。 我只是将源代码用作字符串(在这些字符串中分割和分割)。在输出文件中,存在一些字符串(但不是所有字符串)。

并且您可以看到,在我的资源中,我有“ option1”。这意味着我也有一些选择。但其他人工作得很好。但是option1(文本文件超过20,000KB)始终会出错。我的来源有什么问题?

Error Occured

下面是我的课程及其setOutFile源。

class UploadedFile
{
    public StorageFile originFile;
    public StorageFile outputFile { get; set; }
    // ....omitted
   public async Task setOutFile(StorageFolder folder)
    {
        var rand = new Random();
        string charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        StringBuilder result = new StringBuilder(13);

        for (int i=0; i<13; i++)
        {
            result.Append(charset[rand.Next(charset.Length)]);
        }
        StringBuilder outputName = new StringBuilder();

        outputName.Append(inputName.Substring(0, inputName.Length - 4));
        outputName.Append("_");
        outputName.Append(result);
        outputName.Append(".txt");
        this.outputName = outputName.ToString();

        if (folder != null)
        {
            outputFile = await folder.CreateFileAsync(outputName.ToString(), CreationCollisionOption.ReplaceExisting);
        }
    }

1 个答案:

答案 0 :(得分:1)

感谢您的所有评论。我认为问题是,正如您所说&visual studio通知的那样,某个进程“锁定”了FileIO。

实际上,直到我满足@Johnny Westlake的建议,我才清楚地知道我遇到了什么问题。我只是升级Visual Studio并重新启动Windows。看起来不错。

所以我想,以前的源代码(比我发布的要早)在Windows上发生了一些错误,并且在继续进行某些处理的同时结束了。

但问题似乎没有解决,这不是事实。当我将大量输入文件添加到我的应用程序时,我的应用程序再次暂停。因此,我使用了try-catch语法。

最后,我将源从“ FILEIO.AppendTextAsync”更改为“ FILEIO.WriteTextAsync”(根据Johnny Westlake的建议)。并且经过大量调试,没有停止,最终我不需要try-catch语法。

其操作时间(时间复杂度)从10〜20秒降低到不到1秒(对于大文件输入)

下面是我的源代码。

       public async Task<List<string>> DoRandom(FileLists fl, StorageFolder folder, StorageFile another_file, int k)
   {
        FileLists retLists = new FileLists();
        List<string> encodingList = new List<string>();

        if (Option1)
        {
            foreach (UploadedFile i in fl)
            {
                await i.setOutFile(folder); // wait until setOutFile ends
                // read stream from storagefile
                using (Stream s = await i.originFile.OpenStreamForReadAsync())
                {
                    // streamreader from stream
                    using (StreamReader sr = new StreamReader(s))
                    {

                        string str = await sr.ReadToEndAsync();
                        StringBuilder stringBuilder = new StringBuilder(str);
                        List<string> ans = doOption1(stringBuilder, k);
                        StringBuilder ret = new StringBuilder();
                        foreach (var j in ans)
                        {
                            ret.Append(j); //<--- append all string
                        }
                        await FileIO.WriteTextAsync(i.outputFile, ret.ToString()); // <-- write it at one time
                    }
                }
            }