【问题标题】:UWP FileIO in use by another process with more than 20,000KB text File另一个进程正在使用 UWP FileIO,文本文件超过 20,000KB
【发布时间】:2018-08-27 18:39:11
【问题描述】:

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

所以,经过大量调试.. 我发现“await FileIo.AppendTextAsync()”部分有问题。下面是它的捕获。如果你放大它,你可以在右下角看到错误 try-catch。

为了解决这个问题,我使用信号量来确保一个进程可以访问 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();
            }
            */
        }

    }
}

我真的很沮丧,因为我无法理解我的来源有什么问题。 我只是让 source 使用字符串进行操作(在这些字符串中拆分和 foreach)。在输出文件中,存在一些字符串(但不是所有字符串)。

如您所见,在我的源代码中,我有“option1”。这意味着我也有一些选择。但其他人工作良好。但是选项1(带有超过20,000KB的文本文件)总是出错。我的来源有什么问题?

下面是我的课程及其 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);
        }
    }

【问题讨论】:

  • 是您的应用程序锁定了文件还是另一个应用程序?
  • ps:你有一个 Visual Studio 更新待定 ;-)
  • 您的问题实际上可能超出您的控制范围,例如您的防病毒软件扫描文件、Windows 卷影复制、索引服务等。请尝试一一关闭这些功能,直到问题消失。
  • @Stefan 感谢您通知我更新与我不确定我是否确实锁定了文件。我只是创建async StroageFile“输出文件”,并将其添加到我的类成员变量中。然后如果option1为真,则执行AppendTextAsync()。
  • 为了避免将来出现这种情况,尤其是 AV,不要循环 FileIO.AppendTextAsync - 它效率低下且有问题。相反,首先附加所有文本,然后通过一次调用将其写入文件。它会快得多,并有助于避免这些问题。

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


【解决方案1】:

感谢您的所有 cmets。我认为问题是,正如你所说和视觉工作室通知,一些进程“锁定”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
                    }
                }
            }

【讨论】:

    猜你喜欢
    • 2018-08-22
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2012-07-25
    相关资源
    最近更新 更多