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
    }
}

Windows 8.1 应用 - 进程无法访问该文件,因为它正由另一个进程使用

你在 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();
}
相关文章: