Windows 8.1 应用 - 进程无法访问该文件,因为它正由另一个进程使用
本文关键字:进程 因为 另一个 文件 应用 访问 Windows | 更新日期: 2023-09-27 18:30:52
我第一次开发Windows 8.1应用程序,并在开发时在Visual Studio 2013中运行它(调试模式)。
我有一个 .xaml 主页,其中包含一个包含我的菜单(列表视图)的框架和另一个包含用户当时选择的页面的框架。
当我的 page2 加载它时,它会写入存储中的文件,然后读取值,这是我对基本数据读取和写入的概念证明。
第一次 page2 加载一切正常,但第二次文件仍然被锁定,并在 WriteTimeStamp() 中抛出以下错误:
错误:
类型为"System.IO.FileLoadException"的异常发生在 mscorlib.dll但没有在用户代码中处理
其他信息:进程无法访问该文件,因为它 正由另一个进程使用。(HRESULT的例外:0x80070020)
代码片段
//Main.Xaml - showing the layout
<Grid>
<Frame x:Name="BasicLayout" Grid.Column="0">
<ListView>
<!-- Menu items... -->
</ListView>
</Frame>
<Frame x:Name="SpecificLayout" Grid.Column="1">
</Frame>
</Grid>
// Main Page navigation logic
void itemListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListViewItem itemClicked = (ListViewItem)e.AddedItems[0];
if(itemClicked != null && itemClicked.Tag != null && !string.IsNullOrEmpty(itemClicked.Tag.ToString()))
{
switch (itemClicked.Tag.ToString())
{
case "Page1":
SpecificLayout.Navigate(typeof(Page1));
break;
case "Page2":
SpecificLayout.Navigate(typeof(Page2));
break;
case "Page3":
SpecificLayout.Navigate(typeof(Page3));
break;
}
}
}
// Page 2 initialisation
public Page2()
{
this.InitializeComponent();
WriteTimestamp();
ReadTimestamp();
}
// Page 2 read/write file logic
async void WriteTimestamp()
{
myTextbox.Text = "saving timestamp";
Windows.Globalization.DateTimeFormatting.DateTimeFormatter formatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("longtime");
StorageFile sampleFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("dataFile.txt", CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(sampleFile, formatter.Format(DateTime.Now)); // THIS LINE THROWS THE ERROR
}
async void ReadTimestamp()
{
try
{
StorageFile sampleFile = await ApplicationData.Current.LocalFolder.GetFileAsync("dataFile.txt");
String timestamp = await FileIO.ReadTextAsync(sampleFile);
// Data is contained in timestamp
myTextbox.Text = timestamp;
}
catch (Exception)
{
// Timestamp not found
}
}
你在 WriteTimeStamp 完成写入之前调用 ReadTimeStamp。异步函数在到达等待时返回,而等待的任务关闭并执行其操作。当等待的任务完成时,函数继续执行下一条语句。
将 WriteTimeStamp 定义为异步任务而不是异步 void,以便可以等待它。由于它是 void,你只需要更改 WriteTimestamp 的返回值和(按照惯例)它的名称。您还需要将调用移到 Page2 的构造函数之外,因为构造函数不能异步。
async Task WriteTimestampAsync()
{
myTextbox.Text = "saving timestamp";
Windows.Globalization.DateTimeFormatting.DateTimeFormatter formatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("longtime");
StorageFile sampleFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("dataFile.txt", CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(sampleFile, formatter.Format(DateTime.Now)); // THIS LINE THROWS THE ERROR
}
。
async void DoTimeStampStuff()
{
await WriteTimestampAsync();
await ReadTimestampAsync();
}