Узнать открывали ли файл
Я хотел бы найти способ обойти это, но все мои Googling только дали создание проверок с помощью обработки исключений. Это против моей религии, поэтому мне было интересно, есть ли у кого-нибудь лучший способ сделать это?
Обновлено примечание по этому решению: проверки с FileAccess.ReadWrite будет не только для чтения, поэтому решение было изменено для проверки с FileAccess.Read . Хотя это решение работает, потому что пытается проверить с FileAccess.Read произойдет сбой, если файл имеет блокировку записи или чтения, однако это решение не будет работать, если файл не имеет блокировки записи или чтения, т. е. он был открыт (для чтения или записи) с помощью FileShare.Читать или файловый.Писать доступ.
оригинал: Я использовал этот код в течение последних нескольких лет, и у меня не было никаких проблем с ним.
поймите, что вы сомневаетесь в использовании исключений, но вы не можете избегать их все время:
вы можете страдать от состояния гонки потоков, на котором есть документированные примеры использования этого в качестве уязвимости безопасности. Если вы проверите, что файл доступен, но затем попробуйте использовать его, вы можете бросить в этот момент, который злоумышленник может использовать для принудительного использования в вашем коде.
лучше всего попробовать поймать / наконец, который пытается получить дескриптор файла.
используйте это, чтобы проверить, заблокирован ли файл:
по соображениям производительности я рекомендую вам прочитать содержимое файла в той же операции. Вот несколько примеров:
возможно, вы могли бы использовать FileSystemWatcher и следите за измененным событием.
Я не использовал это сам, но, возможно, стоит попробовать. Если filesystemwatcher оказывается немного тяжелым для этого случая, я бы пошел на цикл try/catch/sleep.
единственный способ, о котором я знаю, - использовать Win32 exclusive lock API, который не слишком быстрый, но примеры существуют.
большинство людей, для простого решения этого, просто попробовать/поймать / спящие петли.
надеюсь, что это помогает!
просто используйте исключение по назначению. Примите, что файл используется, и повторите попытку, пока действие не будет завершено. Это также самое эффективное потому что вы не тратите никакие циклы проверяя государство перед действовать.
используйте функцию ниже, например
многоразовый метод, который истекает через 2 секунды
вы можете вернуть задачу, которая дает вам поток, как только он становится доступным. Это упрощенное решение, но это хорошая отправная точка. Это потокобезопасными.
Вы можете использовать этот поток как обычно:
принятые ответы выше страдают проблемой, где, если файл был открыт для записи с помощью файла.Режиме чтения или если файл имеет атрибут только для чтения код не будет работать. Это модифицированное решение работает наиболее надежно, имея в виду две вещи (как и для принятого решения):
- Он не будет работать для файлов, которые были открыты с записи режим
- это не учитывает проблемы с потоками, поэтому вам нужно будет заблокировать его вниз или обрабатывать вопросы резьбы отдельно.
имея в виду вышеизложенное, это проверяет, является ли файл либо заблокирован для записи или заблокировать, чтобы предотвратить чтение:
вот некоторый код, который, насколько я могу судить, делает то же самое, что и принятый ответ, но с меньшим кодом:
однако я думаю, что это более надежно сделать следующим образом:
вы можете использовать мою библиотеку для доступа к файлам из нескольких приложений.
вы можете установить его из nuget: Install-Package Xabe.Забыл
fileLock.Метод Acquire вернет true только в том случае, если может заблокировать файл исключительно для этого объекта. Но приложение, которое загружает файл, должно делать это и в file lock. Если объект недоступен metod возвращает ложный.
по моему опыту, вы обычно хотите это сделать, а затем "защитить" свои файлы, чтобы сделать что-то необычное, а затем использовать "защищенные" файлы. Если у вас есть только один файл, который вы хотите использовать, вы можете использовать трюк, который объясняется в ответе Джереми Томпсона. Однако, если вы попытаетесь сделать это во многих файлах (например, когда вы пишете установщик), вам будет очень больно.
очень элегантный способ это можно решить, используя тот факт, что ваш файл система не позволит вам изменить имя папки, если один из файлов там это используется. Держите папку в той же файловой системе, и она будет работать как шарм.
обратите внимание, что вы должны знать об очевидных способах использования этого. В конце концов, файлы не будут закрыты. Кроме того, имейте в виду, что есть и другие причины, которые могут привести к вашему Move сбой операции. Очевидно, что правильная обработка ошибок (MSDN) может помочь здесь.
для отдельных файлов я придерживайтесь предложения блокировки, опубликованного Джереми Томпсоном.
помимо рабочих 3-лайнеров и только для справки: если вы хотите полноценный информация - есть небольшой проект на Microsoft Dev Center:
мне интересно посмотреть, вызывает ли это какие-либо рефлексы WTF. У меня есть процесс, который создает и впоследствии запускает PDF-документ из приложения консоли. Однако я имел дело с хрупкостью, когда, если пользователь должен был запустить процесс несколько раз, генерируя один и тот же файл без предварительного закрытия ранее созданного файла, приложение выбросит исключение и умрет. Это было довольно частое явление, потому что имена файлов основаны на номерах предложений по продажам.
а не потерпев неудачу в такой нелюбезной манере, я решил полагаться на автоматическое увеличение версий файлов:
вероятно, можно уделить больше внимания catch блок, чтобы убедиться, что я улавливаю правильное исключение(Ы) IOException. Я, вероятно, также очистить хранилище приложений при запуске, так как эти файлы предназначены для временного в любом случае.
Я понимаю, что это выходит за рамки вопроса OP о простой проверке того, используется ли файл, но это действительно была проблема хотите решить когда я приехал сюда, так что, возможно, это будет полезно кому-то еще.
попробуйте переместить / скопировать файл в временный каталог. Если вы можете, у него нет замка, и вы можете безопасно работать в temp dir без блокировки. Остальное просто попробуйте переместить его снова в X секунд.
Я использую этот обходной путь, но у меня есть промежуток времени между проверкой блокировки файла с помощью функции IsFileLocked и открытием файла. В этом промежутке времени какой-то другой поток может открыть файл, поэтому я получу IOException.
Итак, я добавил дополнительный код для этого. В моем случае я хочу загрузить XDocument:
что вы думаете? Могу я что-нибудь изменить? Может быть, мне вообще не нужно было использовать функцию IsFileBeingUsed?
Всем привет! Сегодня нам предстоит выяснить, как найти недавние документы в компьютере. Дело все в том, что подобная операция может пригодиться каждому.
Например, если пользователь подозревает, что кто-то залезает в его операционную систему и работает в ней без разрешения. Отслеживание истории посещений и открытых/сохраненных файлов — дело не самое простое. Существуют различные способы получения интересующих пользователя сведений. Остановимся исключительно на файлах, которые были недавно открыты, изменены или сохранены.
Всякий раз когда открываем какой-нибудь файл ОС Windows регестрирует такое действие и размещает ярлык этого файла в секцию «Недавно открытые элементы» в меню «Пуск», который расположен по адресу %APPDATA%/Microsoft/Windows/Recent. Только вот по умолчанию папка истории хранит сравнительно небольшое число элементов. Увеличить его можно, изменив кое-какие настройки в редакторе локальных групповых политик.
В ОС Windows есть команда, с помощью которой вы можете увидеть, какие папки или файлы были открыты ранее. Напоминает историю браузера.
Через проводник
Штатный системный инструмент Проводник позволяет получить доступ к любым файлам и папкам, имеющимся на диске компьютера, в том числе, когда объект требуется быстро найти. Интерфейс и функциональные возможности встроенного инструмента зависят от версии системы, но принцип использования остаётся всё тем же.
Чтобы открыть этот раздел:
Откроется папка с файлами и другими папками. Вы можете открыть файлы и папки сразу из этого окна.
В результате откроется папка с последними изменёнными файлами на компьютере, в хронологической последовательности, начиная с последнего изменённого.
Функция может понадобиться тем, у кого на ПК имеются сотни файлов. Если вы потеряли файл или папку, то можете найти их через историю своих действий.
Аналогичным образом можно открыть и почистить папки:
где хранятся пути к файловым объектам и используемым приложениями Windows.
Через стороннюю утилиту OSFV
Также для просмотра недавно открытых файлов вы можете воспользоваться специальной утилитой OpenSaveFilesView (OSFV), разработанной компанией Nirsoft. OSFV работает напрямую с реестром, извлекая список «последних» файлов из подразделов OpenSavePidlMRU и OpenSaveMRU.
Помимо их имён и расширений, утилита отображает их порядковый номер, полный путь, дату/время создания и модификации, время последнего просмотра, атрибуты и размер.
Имеется возможность сортировки списка и сохранения выбранных элементов в текстовый лог. Установки утилита не требует, интерфейс имеет простой и понятный.
Совместима OpenSaveFilesView со всеми популярными версиями Windows обеих разрядностей. Язык интерфейса по умолчанию — английский. К программе прилагается русификатор, доступный для скачивания на сайте разработчика. Это простой INI-файл, который нужно поместить в одну папку с программой. И сама утилита, и русификатор совершенно бесплатны.
В жизни бывают ситуации, требующие особого внимания, а то и банальной проверки. И если есть подозрения в несанкционированном доступе к личному компьютеру - лучше уметь их проверить. Узнать, какие файлы открывались в Ваше отсутствие, очень просто.
- Как узнать, какие файлы открывались
- Как найти сохраненный файл
- Как узнать, какие программы запускались
- Доступ к выбранной учетной записи или администраторские права на ПК
Информация должна быть надежно защищена. Об этом необходимо позаботиться заранее. Если к компьютеру имеют доступ несколько человек, не поленитесь завести для себя отдельную учетную запись с надежным паролем. Но если вдруг все же возникли подозрения, что в компьютер заглядывал кто-то посторонний - нужно уметь это проверить и отследить. Узнать, какие файлы открывались последними достаточно просто.
Самый просто способ узнать, какие файлы открывались, под силу каждому. Откройте меню «Пуск» - в правой колонке при стандартных настройках отображаются все элементы, открывавшиеся на компьютере за последние несколько дней. Если данный раздел отсутствует - настройте показ. Для этого зайдите в панель управления, выберите раздел «Оформление экрана», в нем подраздел «Панель задач и меню Пуск», затем «Настройка меню Пуск». В открывшемся окне кликните вкладку «Меню Пуск» и поставьте галочку в чекбоксе «Хранить и отображать список недавно открывавшихся элементов».
Еще один способ узнать, какие файлы открывались на компьютере - отсортировать их по дате изменения. Для этого нужно зайти в меню «Мой компьютер» и задать расширенные параметры поиска: «Поиск - Задать параметры - Сортировать по дате изменения» и затем выбрать интересующий день. После завершения обработки данных на экран будет выведен список всех файлов и папок, которые открывались за указанный промежуток времени.
Необходимо помнить, что в этом случае будут показаны только файлы, которые были открыты и затем вновь сохранены. Если, к примеру, злоумышленник просто копировал информацию на внешний носитель, поиск этого не покажет.
На общедоступном сетевом ресурсе могут возникать ошибки доступа к файлам. Причиной этому является некорректно завершенная сессия пользователя, ошибки в работе ПО или просто кто-то открыл файл и не закрывает его. В такой ситуации файл оказывается заблокированным и не доступен для работы другим пользователям.
Решить проблему доступа к файлу можно путем закрытия сеансов использующих этот файл. В этой статье я расскажу как определить кто открыл файл в сетевой папке и как закрыть это подключение.
Рассмотрим два способа:
- Через оснастку "Управление компьютером" консоли управления Windows;
- При помощи утилиты командной строки - Openfiles.
1 способ. Получаем список открытых файлов с помощью оснастки "Управление компьютером".
Для получения списка открытых файлов на файловом сервере воспользуемся оснасткой консоли "Управление компьютером". Для запуска оснастки нажимаем сочетание клавиш "Win + R" и набираем название оснастки "compmgmt.msc".
В иерархии оснастки переходим /Управление компьютером/Служебные программы/Общие папки/Открытые файлы.
В правой части оснастки появится список открытых файлов. Здесь можно увидеть имя пользователя открывшего файл, количество блокировок и режим доступа к файлу.
Закрываем файл. Чтобы закрыть сетевой файл открытый другим пользователем находим его в списке и в контекстном меню выбираем пункт "Закрыть открытый файл".
2 способ. Просмотр открытых файлов через командную строку утилитой Openfiles.
Утилита Openfiles дает нам более широкие возможности по поиску и закрытию заблокированных файлов.
C помощью openfiles можно просмотреть список открытых файлов на сервере удаленно. Для этого открываем командную и запускаем утилиту с параметрами.
где
/Query - показывает все открытые файлы,
/s - определяет имя удаленного компьютера.
В случае, когда необходимо указать логин и пароль пользователя для подключения к удаленному компьютеру, задаются параметры: /u - логин пользователя, /p - пароль пользователя.
По-умолчанию список файлов показан в формате таблицы, но есть параметры позволяющие изменить формат вывода:
/fo csv - выводит список в формате csv с разделителем запятая;
/fo list - показывает открытые файлы в формате списка;
/fo table - формат таблицы.
Определяем кто открыл сетевой файл.
Чтобы найти пользователя, который открыл и заблокировал нужный нам файл запускаем Openfiles с командой find.
в команде find указан параметр /i, чтобы поиск был регистронезависимым.
После того когда мы узнали имя пользо
Закрываем заблокированный сетевой файл.
Закрыть открытый файл можно по id сессии таким способом:
Закрыть все сетевые подключения к файлам и папкам, которые открыл пользователь BadUser:
Закрыть все файлы и директории открытые в режиме чтение/запись:
Закрыть все подключения к директории с именем "c:\myshare":
Чтобы сбросить все сессии на удаленном сервере FileServer, которые открыл пользователь domain\baduser, независимо от id сессии:
Читайте также: