Windows UWP С# удалить папку

Когда я пытаюсь удалить папку, я получаю следующую ошибку:

Exception thrown: 'System.UnauthorizedAccessException' in mscorlib.ni.dll

Additional information: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

Весь блок кода здесь:

StorageFolder folder;

            try

            {

                folder = await ApplicationData.Current.LocalFolder.GetFolderAsync("images");
                await folder.DeleteAsync();

                StorageFolder new_images = await ApplicationData.Current.LocalFolder.CreateFolderAsync("images", CreationCollisionOption.ReplaceExisting);

            }

            catch (FileNotFoundException ex)

            {

                StorageFolder new_images = await ApplicationData.Current.LocalFolder.CreateFolderAsync("images", CreationCollisionOption.ReplaceExisting);

            }

Ошибка возникает в этой строке:

await folder.DeleteAsync();

Я предполагаю, что проблема возникает, когда я добавляю кучу изображений из папки изображений, например:

tmp.Source = new BitmapImage(new Uri("ms-appdata:///local/images/image_" + ring.Name + ".jpg", UriKind.Absolute));

Это также может быть, когда я сохраняю изображение:

try {
                StorageFile file = await image_folder.CreateFileAsync("image_" + id + ".jpg", CreationCollisionOption.ReplaceExisting);
                await FileIO.WriteBytesAsync(file, responseBytes);
            } catch (System.Exception)
            {

            }

Если проблема возникает из-за того, что он ее читает, и я пытаюсь удалить папку, как я могу заставить ее работать, я, честно говоря, не знаю, что здесь делать.


person Cody Robinson    schedule 15.12.2015    source источник
comment
Пожалуйста, опубликуйте минимальный рабочий пример, который воспроизводит проблему.   -  person Bartosz    schedule 16.12.2015


Ответы (3)


Возникло исключение: «System.UnauthorizedAccessException» в mscorlib.ni.dll

Я заметил, что вы пытались сохранить изображение с помощью метода FileIO.WriteBytesAsync(), я не мог видеть, как вы загружаете файл изображения в массив байтов. Наиболее возможная причина: «забыли удалить поток после его открытия для загрузки данных изображения».

Вот как я загружаю изображение и сохраняю его в LocalFolder:

private async Task<byte[]> ConvertImagetoByte(StorageFile image)
{
            IRandomAccessStream fileStream = await image.OpenAsync(FileAccessMode.Read);
            var reader = new Windows.Storage.Streams.DataReader(fileStream.GetInputStreamAt(0));
            await reader.LoadAsync((uint)fileStream.Size);

            byte[] pixels = new byte[fileStream.Size];

            reader.ReadBytes(pixels);

            return pixels;

}

private async void btnSave_Click(object sender, RoutedEventArgs e)
{
            try
            {
                var uri = new Uri("ms-appx:///images/image.jpg");
                var img = await StorageFile.GetFileFromApplicationUriAsync(uri);
                byte[] responseBytes = await ConvertImagetoByte(img);

                var image_folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("images", CreationCollisionOption.OpenIfExists);

                StorageFile file = await image_folder.CreateFileAsync("image_test.jpg", CreationCollisionOption.ReplaceExisting);
                await FileIO.WriteBytesAsync(file, responseBytes);

                tmp.Source = new BitmapImage(new Uri("ms-appdata:///local/images/image_test.jpg", UriKind.Absolute));
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
}
person Franklin Chen - MSFT    schedule 16.12.2015
comment
Мне нужна возможность загрузить файл и не заблокировать его приложением. Это работает для его сохранения, но если файл уже находится в кеше, он просто загружает его, поэтому проблема не в сохранении, а в загрузке. - person Cody Robinson; 17.12.2015

Это может показаться странным, но иногда возникают проблемы с авторизацией, когда мы не запускаем нашу IDE в качестве администратора. Для этого щелкните правой кнопкой мыши значок IDE (Visual Studio) и выберите «Запуск от имени администратора».

Попробуйте это, если это решит вашу проблему.

person ItsZeus    schedule 16.12.2015
comment
Запустил визуальную студию в качестве администратора, и это не сработало, по-прежнему не удалось выполнить папку ожидания. DeleteAsync(); линия - person Cody Robinson; 17.12.2015

Вам нужно использовать lock, чтобы быть уверенным, что файл или папка не будут изменены при использовании в другом потоке. Поскольку вы используете ожидание, я бы посоветовал взглянуть на это - https://github.com/bmbsqd/AsyncLock/

Вы можете получить больше информации о синхронизации потоков здесь - https://msdn.microsoft.com/ru-ru/library/ms173179(v=vs.80).aspx

person khamitimur    schedule 16.12.2015