删除 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,但仍然面临同样的问题。每次计时器执行任务时创建新文件会浪费大量内存。如何删除文件???
问题是您在加载图像之前删除了图像(位图是异步加载的)。
要解决这个问题,只需替换,
// 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。