Метод CopyAsync не заменяет существующий файл. UWP. Приложение-хранилище

#c# #uwp

#c# #uwp

Вопрос:

Сейчас я работаю над операцией редактирования в своем приложении. Таким образом, в операции редактирования есть возможность изменить изображение, и в то же время имя файла, в котором хранится изображение контакта, не может быть переименовано (в течение одного сеанса работы файлы изображений будут меняться, но все эти файлы будут иметь одно и то же имя).

И я использовал метод перегрузки CopyAsync (документы к этому методу здесь), который, как я понимаю, должен заменить файл на существующий файл с тем же именем.

Я получаю imageFile переменную по FileOpenPicker . Приведенный ниже код выполняется каждый раз, когда я выбираю изображение с помощью FileOpenPicker . И когда я повторно выбираю изображение в результате Image , элемент управления пользовательского интерфейса показывает мне предыдущее выбранное изображение. Я ожидаю, что Image будет просмотр последнего выбранного мной изображения, но этого не произошло.

     public BitmapImage Image { set; get; }

    //Copy of the file that saved in temporary storage
    StorageFile fileForView = await imageFile.CopyAsync 
       (ApplicationData.Current.TemporaryFolder,
       fileName,
       NameCollisionOption.ReplaceExisting);

    Image = new BitmapImage(new Uri(fileForView.Path));
  

Возможно, я неправильно понимаю логику CopyAsync метода, если я в этом случае, пожалуйста, покажите мне, как заставить мой план работать с этим методом, если это возможно. В противном случае предложите свое решение, потому что я понятия не имею, как это сделать.

Также я пытался сделать это с помощью CopyAndReplaceAsync метода. Но все еще нет результата. Я делаю это таким образом:

          if (null != await ApplicationData.Current.TemporaryFolder.TryGetItemAsync(fileName))
        {
            StorageFile storageFile = await ApplicationData.Current.TemporaryFolder.GetFileAsync(fileName);

            await storageFile.CopyAndReplaceAsync(imageFile);
        }
  

Комментарии:

1. Вы уверены, что он не переопределяется? Я думаю, что, возможно, вы неправильно открываете файл повторно. Можете ли вы показать свой код для загрузки изображения?

2. Вы имеете в виду, что может быть проблема в том, что изображение не было заменено? Я думал, что файл, который CopyAsync возвращает, не нуждается ни в какой операции приложения, чтобы сделать его работоспособным. Image = new BitmapImage(new Uri(fileForView.Path));

3. Вы вообще меняете изображение перед его сохранением или просто повторно сохраняете то же изображение? Вы всегда могли бы сделать File.Delete(storageFile) , если бы хотели попробовать, но мне кажется, что он перезаписывает его — это просто тот же образ.

4. Да, я повторно сохраняю изображение. Я попробовал ваш метод. И для большей уверенности после удаления я проверил временную папку, и в ней не сохранилось ни одного файла. Поэтому, даже если я копирую новый файл во временную папку, он все равно показывает мне предыдущий. Также я использовал DeleteAsync метод StorageFile класса. И все еще никакого результата.

Ответ №1:

Я ожидаю, что изображение будет просматривать последнее выбранное мной изображение, но этого не произошло.

Приведенный выше CopyAsync метод верен, и я протестировал его со следующим кодом, он работает хорошо.

 private async void ListOption_ItemClick(object sender, ItemClickEventArgs e)
{
    FileOpenPicker openPicker = new FileOpenPicker();
    openPicker.ViewMode = PickerViewMode.Thumbnail;
    openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
    openPicker.FileTypeFilter.Add(".jpg");
    openPicker.FileTypeFilter.Add(".jpeg");
    openPicker.FileTypeFilter.Add(".png");

    StorageFile file = await openPicker.PickSingleFileAsync();
    if (file != null)
    {
        StorageFile fileForView = await file.CopyAsync(ApplicationData.Current.TemporaryFolder, file.Name, NameCollisionOption.ReplaceExisting);
        Image = new BitmapImage(new Uri(fileForView.Path));
        TestImg.Source = Image;
    }
    else
    {

    }
}