删除 Windows 8 中的存储文件

本文关键字:存储文件 Windows 删除 | 更新日期: 2023-09-27 18:32:13

我想每 10 秒捕获一次图像。为此,我将使用 Timer 类,该类将运行以下代码段:

 async private void captureImage()
    {
        capturePreview.Source = captureManager;
        await captureManager.StartPreviewAsync();
        ImageEncodingProperties imgFormat = ImageEncodingProperties.CreateJpeg();

        // create storage file in local app storage
        StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(
            "TestPhoto.jpg",
            CreationCollisionOption.GenerateUniqueName);

        // take photo
        await captureManager.CapturePhotoToStorageFileAsync(imgFormat, file);
        // Get photo as a BitmapImage
        BitmapImage bmpImage = new BitmapImage(new Uri(file.Path));
        // imagePreivew is a <Image> object defined in XAML
        imagePreivew.Source = bmpImage;

        await captureManager.StopPreviewAsync();    
        //send file to server
        sendHttpReq();
         await file.DeleteAsync(StorageDeleteOption.PermanentDelete); 

    }

目前我正在单击按钮时调用上述函数,

我想在传输图像后删除该文件,因为我将把它发送到网络服务器。但是我没有看到图像Preivew在按钮单击时更新,而当我不删除文件时,每次按下按钮时我都会看到图像Preivew发生变化。我也尝试使用CreationCollisionOption.ReplaceExist,但仍然面临同样的问题。每次计时器执行任务时创建新文件会浪费大量内存。如何删除文件???

删除 Windows 8 中的存储文件

问题是您在加载图像之前删除了图像(位图是异步加载的)。

要解决这个问题,只需替换,

    // Get photo as a BitmapImage
    BitmapImage bmpImage = new BitmapImage(new Uri(file.Path));

    using (IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
        {
            BitmapImage bmpImage = new BitmapImage();
            await bmpImage.SetSourceAsync(fileStream);
        }

像这样,您将等待图像加载完成,然后再将其删除。

此外,您还应该等待sendHttpReq();因为否则在将请求发送到服务器之前,图像也将被删除。

您可能想要更正的另一件事是,在上一次捕获未完成时,可能会对 captureImage 进行第二次调用。要解决此问题,您可以使用IsStillCapture标志,如果它仍在捕获,则返回,或者使用AsyncLock来防止同时使用两个CapturePhotoToStorageFileAsync。