2017-01-27 2 views
1

Я нашел аналогичный question для моего, но, к сожалению, у него не было ответа.C# Создать файл после StorageFile.DeleteAsync с ошибкой 0x80070005 E_ACCESSDENIED

Я использую класс StorageFile в C# для создания, записи и повторного удаления файла. На моей второй итерации он не может создать файл, возвращая ошибку отказа в доступе.

Вот простой модульного тестирования я соединял в Visual Studio 2015, чтобы продемонстрировать проблему:

[TestMethod] 
public async Task DeleteTest() 
{ 
    StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder; 
    byte[] array = System.Text.Encoding.ASCII.GetBytes("Test data"); 

    int i = 1, max = 20; 
    string phase = "not started"; 
    try 
    { 
     do 
     { 
      // create file 
      phase = "creating"; 
      StorageFile file = await folder.CreateFileAsync("test" /*,CreationCollisionOption.GenerateUniqueName*/); 

      // write data to the file 
      phase = "opening"; 
      System.IO.Stream stream = await file.OpenStreamForWriteAsync(); 

      phase = "writing"; 
      await stream.WriteAsync(array, 0, array.Length); 

      phase = "flushing"; 
      await stream.FlushAsync(); 

      // delete file 
      phase = "deleting"; 
      await file.DeleteAsync(); 
     } while (++i <= max); 
    } 
    catch(Exception e) 
    { 
     Assert.Fail("While '{0}' on iteration {1}: {2}", phase, i, e.Message); 
    } 
} 

выше утверждение пожаров, отчетность:

В то время как 'создание' на итерации 2: В доступе отказано. (Исключение из HRESULT : 0x80070005 (E_ACCESSDENIED))

Если кто-то может позволить мне знать, что я делаю неправильно, я ценю это. Я с этим согласен.

+0

Вы уверены, что 'await file.DeleteAsync();' закончил перед следующей итерацией 'await folder.CreateFileAsync'? – Prajwal

+0

Нет, я не. Кажется, это похоже на то, что он еще не закончен, потому что я получаю ошибку отказа в доступе. Но я ожидал бы, что оператор «ждут» заставит выполнение программы ждать, пока файл не будет удален. – Jeff

+0

Я думаю, что перед удалением файла сначала должен быть Dispose() 'объект System.IO.Stream. Рекомендуется очищать ресурсы, используемые объектом. Это также может решить проблему ACCESSDENIED. – crazyGamer

ответ

0

Некоторые функции библиотеки, такие как поток файла сделать доступ использования неуправляемых ресурсов, которые должны быть должным образом очищены до объекта ручки могут быть уничтожены. Это позволяет избежать ситуации, например, когда файлы открыты в фоновом режиме, даже после того, как программа выполняется выполнение и предотвращает их от изменяемые и т.д.

В случае System.IO и связанной с ними функциональности, Microsoft recommends, что вызывается метод Dispose() или Close() что делает именно это. В вашем случае, скорее всего, файл не может быть успешно удален, поскольку он открыт через объект Stream.

Следовательно, необходимо устранить проблему, добавив Dispose() после Flush() на Stream.

ПРИМЕЧАНИЕ: Dispose() автоматически вызывает Flush(), поэтому явный вызов является избыточным.

Смежные вопросы