Как я могу надежно гарантировать доступ к файлу / папке? - PullRequest
1 голос
/ 20 февраля 2009

- Какой самый надежный способ обеспечить доступ к папке или файлу, которыми я хочу манипулировать (не только для чтения)?

-Я знаю, что могу использовать ACL для добавления / установки записей (сделать файл / папку не только для чтения), но как узнать, нужно ли мне использовать разрешения безопасности для обеспечения доступа к файлу? Или я могу просто добавить это в качестве дополнительной меры и обработать исключительный / отрицательный сценарий?

-Как я знаю, когда закрывать или просто промывать поток? Например, я должен попытаться использовать потоки один раз в методе, а затем очистить / закрыть / дипозировать в конце? Если я использую dispose (), нужно ли мне вызывать flush () и close () явно?

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

Спасибо

Ответы [ 5 ]

1 голос
/ 21 февраля 2009

Нет способа гарантировать доступ к файлу. Я знаю, что это не популярный ответ, но это на 100% верно. Вы никогда не можете гарантировать доступ к файлу, даже если у вас есть эксклюзивный открытый доступ на компьютере с Win32.

Есть слишком много способов, которыми это может потерпеть неудачу, которые вы просто не можете контролировать. Классическим примером является файл, открытый по сети. Откройте его любым способом с любой учетной записью, я просто подойду и дерну сетевой кабель. Это убьет ваш доступ к файлу.

Я не говорю, что это подло или высокомерно. Я говорю это, чтобы люди понимали, что работа с файловой системой - очень опасная операция. Вы должны принять, что операция может и не удастся. Крайне важно, чтобы у вас был запасной вариант для любой операции, касающейся диска.

0 голосов
/ 21 февраля 2009
  • Flush () - синхронизирует буфер в памяти с диском. Вызывайте, когда хотите записать буфер на диск, но оставьте файл открытым для дальнейшего использования.
  • Dispose (bool) - освобождает неуправляемый ресурс (т. Е. Дескриптор файла ОС) и, если передано значение true, также освобождает управляемые ресурсы.
  • Close () - вызывает Dispose (true) для объекта.

Кроме того, Dispose сбрасывает данные перед закрытием дескриптора, поэтому нет необходимости явно вызывать сброс (хотя в любом случае было бы неплохо часто выполнять сброс данных, в зависимости от объема и типа обрабатываемых данных).

Если вы выполняете относительно атомарные операции над файлами и не нуждаетесь в длительном дескрипторе, парадигма «использование» полезна для обеспечения правильной обработки файлов, например ::

using (StreamReader reader = new StreamReader("filepath"))
{
    // Do some stuff
} // CLR automagically handles flushing and releasing resources
0 голосов
/ 20 февраля 2009
  • Попробуйте записать новый файл в папку и перехватить все исключения. Наряду с этим обычно выполняются проверки работоспособности, такие как папка / файлы и т. Д.

  • Вы никогда не должны изменять безопасность папок в коде, поскольку среда может резко измениться и вызвать серьезные головные боли. Скорее убедитесь, что безопасность хорошо задокументирована и настроена заранее. Либо альтернативно используйте олицетворение в своем собственном коде, чтобы гарантировать, что вы всегда выполняете требуемый код как пользователь с полными разрешениями на папку / файл.

  • Никогда не вызывайте Dispose (), если у вас нет другого выбора. Вы всегда очищаете перед закрытием файла или когда вы хотите зафиксировать содержимое потока в файл / диск. Выбор того, когда это сделать, зависит от объема данных, которые необходимо записать, и времени, затрачиваемого на написание данных.

0 голосов
/ 20 февраля 2009

100% надежный способ убедиться, что папка доступна для записи - создайте файл, закройте его, убедитесь, что он есть, а затем удалите его. Немного утомительно, но вы просили о защите от дурака =)

Ваша лучшая ставка, которая охватывает ваш вопрос о ACL, заключается в обработке различных исключений, если вы не можете записать в файл.

Кроме того, я всегда вызываю Close явно, если мне не нужно читать из файла, прежде чем я закончу его записывать (в этом случае я вызываю flush, затем close).

0 голосов
/ 20 февраля 2009

- Какой самый надежный способ обеспечить доступ к папке или файлу, которыми я хочу управлять (не только для чтения)?

Открытие их в режиме записи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...