【发布时间】: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