2012-02-18 3 views
0

Я пишу свою файловую систему с использованием библиотеки C# и Dokan и застрял на WriteFile.Реализация виртуального диска с Dokan. Stuck on WriteFile

public int WriteFile(
      String filename, 
      Byte[] buffer, 
      ref uint writtenBytes, 
      long offset, 
      DokanFileInfo info) 
     {   
      try 
      { 
       FileStream fs = File.OpenWrite(GetFullPath(filename) , FileMode.Open);    
       fs.Seek(offset, SeekOrigin.Begin); 
       fs.Lock(offset, buffer.Length); 
       fs.Write(buffer, 0, buffer.Length); 
       fs.Unlock(offset, buffer.Length); 
       writtenBytes = (uint)buffer.Length; 
       return 0; 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("FAIL WriteFile {0}", e.Message); 
       return -1; 
      } 
     } 

Когда я запускаю приложение и открываю txt-файл с виртуального диска Dokan, добавьте строку и попытайтесь ее сохранить. Я получаю сообщение из блокнота «Параметр инкрементирован».

В коде я получаю исключение в вызове File.OpenWrite(). Исключением является System.IO.IOException. Сообщение: «Процесс не может получить доступ к файлу foo.txt, потому что он используется другим процессом».

  • Файл открыт только с помощью блокнота.
  • То же поведение можно наблюдать, например зеркало, поставляемый с Докана библиотекой
  • я добавил права администратора в мою программу в манифесте, это не помогло

Докано должно работать как прокси-сервер, позволяющий вызов WriteFile, определенный пользователем, не так ли? Как я могу это сделать, если он заблокирован для записи?

Пожалуйста, помогите. Может быть, у вас есть опыт работы с Dokan или какой-либо подсказкой, почему он не работает.

Я использую - Win 7 Pro x64 - 64 разрядный драйвер Докан - App скомпилирован как x86

+0

Скомпилирован ли драйвер для 32-разрядного, 64-разрядного или AnyCPU (как для вашего кода, так и для Dokan)? Какая битность - это ПК, на котором вы тестируете? –

+1

Возможно, я неправильно читаю, но похоже, что «Блокнот» просит Windows сохранить в Y: \ text.txt, Windows переводит его в Dokan, Dokan перенаправляет его вам, вы передаете его обратно в Windows с тем же путем? Если вы хотите проксировать существующий файл, не должны ли вы использовать другой путь? – hvd

+0

hvd Я не знаю, получит ли Windows из VirtualDriveLetter: \ foo.txt или с фактического пути. Имя файла, которое я получаю в WriteFile, это «\ foo.txt», затем я добавляю полный путь к нему ActualDriveLetter: \ path \ file и пытаюсь открыть его с помощью File.OpenWrite – WannabeCoder

ответ

1

Вы должны вызвать Dispose на поток перед выходом из метода. Это не лучшее решение. Вы создаете поток файлов в CreateFile, передаете его в info.Context и используете его в ReadFile, WriteFile и вызываете на нем в Cleanup.

+0

Спасибо за ответ! Я попробую. – WannabeCoder

+0

Я пробовал ваше решение. Это работает, но .. Но я могу открыть текстовый файл в блокноте, внести некоторые изменения, закрыть блокнот и сохранить эти изменения. Но когда я делаю это во второй раз, блокнот говорит «Недопустимый параметр». Проблема заключается в том, что я обработал FileSteam только в CleanUp, когда я делаю Dispose как в CleanUp, так и в CloseFile, все работает нормально. Скажите, пожалуйста, как правильно закрыть файл. Должен ли тот же код для удаления FileStream быть как в CleanUp, так и в CloseFile? Какой из них называется первым. Заранее спасибо! – WannabeCoder

+0

CloseFile иногда не вызывается, но Cleanup всегда просматривает здесь http://liquesce.codeplex.com/SourceControl/changeset/view/73752 – user629926

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