C проверка открыт ли файл

Обновлено: 06.07.2024

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

Предоставляет свойства и методы экземпляра для создания, копирования, удаления, перемещения и открытия файлов, а также позволяет создавать объекты FileStream. Этот класс не наследуется.

Примеры

В следующем примере показаны некоторые основные члены FileInfo класса.

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

В этом примере создаются выходные данные, аналогичные приведенным ниже.

Комментарии

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

При выполнении нескольких операций над одним и тем же файлом может оказаться более эффективным использование FileInfo методов экземпляра вместо соответствующих статических методов File класса, поскольку проверка безопасности не всегда требуется.

Многие из FileInfo методов возвращают другие типы ввода-вывода при создании или открытии файлов. Эти другие типы можно использовать для дальнейшего управления файлом. Дополнительные сведения см. в разделе определенные FileInfo элементы, такие как Open ,, OpenRead OpenText , CreateText или Create .

По умолчанию всем пользователям предоставляется полный доступ на чтение и запись к новым файлам.

В следующей таблице описаны перечисления, используемые для настройки поведения различных FileInfo методов.

Перечисление Описание
FileAccess Указывает доступ к файлу для чтения и записи.
FileShare Указывает уровень доступа, разрешенный для уже используемого файла.
FileMode Указывает, будет ли содержимое существующего файла сохранено или перезаписано, и должны ли запросы на создание существующего файла вызывать исключение.

В членах, принимающих путь в качестве входной строки, этот путь должен иметь правильный формат или возникнет исключение. Например, если путь является полным, но начинается с пробела, путь не усекается в методах класса. Поэтому путь имеет неправильный формат и возникает исключение. Аналогично, путь или сочетание путей не могут быть полными и дважды. Например, "c:\temp c:\Windows" также вызывает исключение в большинстве случаев. При использовании методов, принимающих строку пути, убедитесь, что пути имеют правильный формат.

В членах, принимающих путь, путь может ссылаться на файл или только на каталог. Указанный путь может также ссылаться на относительный путь или путь в формате UNC для имени сервера и общего ресурса. Например, все следующие допустимые пути:

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

DirectoryСвойство получает объект, представляющий родительский каталог файла.

DirectoryNameСвойство получает полный путь к родительскому каталогу файла.

ExistsСвойство проверяет наличие файла перед его обработам.

IsReadOnlyСвойство извлекает или задает значение, указывающее, можно ли изменить файл.

LengthВозвращает размер файла.

NameВозвращает имя файла.

Конструкторы

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

Представляет полный путь к каталогу или файлу.

Первоначально заданный пользователем относительный или абсолютный путь.

Свойства

Получает или задает атрибуты для текущего файла или каталога.

Получает или задает время создания текущего файла или каталога.

Получает или задает время создания текущего файла или каталога в формате UTC.

Получает экземпляр родительского каталога.

Получает строку, представляющую полный путь к каталогу.

Получает значение, показывающее, существует ли файл.

Возвращает часть имени файла, включая начальную точку . даже если это полное имя файла, или пустая строка, если расширение отсутствует.

Получает полный путь к каталогу или файлу.

Возвращает или задает значение, позволяющее определить, является ли текущий файл доступным только для чтения.

Получает или задает время последнего доступа к текущему файлу или каталогу.

Получает или задает дату и время последнего доступа к заданному файлу или каталогу в формате всеобщего скоординированного времени (UTC).

Получает или задает время последней операции записи в текущий файл или каталог.

Получает или задает время последней операции записи в текущий файл или каталог в формате всеобщего скоординированного времени (UTC).

Получает размер текущего файла в байтах.

Если этот FileSystemInfo экземпляр представляет ссылку, возвращает путь к цели ссылки. Если ссылка не существует в FullName или этот экземпляр не представляет ссылку, возвращает null .

Получает имя файла.

Методы

Создает StreamWriter, который добавляет текст в файл, представленный этим экземпляром FileInfo.

Копирует существующий файл в новый файл и запрещает перезапись существующего файла.

Копирует существующий файл в новый файл и разрешает перезапись существующего файла.

Создает символическую ссылку, расположенную в FullName , указывающую на указанный объект pathToTarget .

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

Создает StreamWriter, который записывает новый текстовый файл.

Расшифровывает файл, зашифрованный текущей учетной записью с помощью метода Encrypt().

Удаляет файл без возможности восстановления.

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

Определяет, равен ли указанный объект текущему объекту.

Возвращает объект FileSecurity, который инкапсулирует записи списка управления доступом (ACL) для файла, описываемого текущим объектом FileInfo.

Получает объект FileSecurity, который инкапсулирует заданный тип записей списка управления доступом для файла, описываемого текущим объектом FileInfo.

Служит хэш-функцией по умолчанию.

Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра.

Устанавливает объект SerializationInfo с именем файла и дополнительными сведениями об исключении.

Возвращает объект Type для текущего экземпляра.

Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.

Создает неполную копию текущего объекта Object.

Создает неполную копию текущего объекта MarshalByRefObject.

Перемещает заданный файл в новое местоположение и разрешает переименование файла.

Перемещает указанный файл в новое расположение, предоставляя параметры для указания нового имени файла и перезаписи конечного файла, если он уже существует.

Открывает файл в заданном режиме.

Открывает файл в заданном режиме с доступом для чтения или записи, или и для чтения, и для записи.

Открывает файл в заданном режиме с доступом для чтения, записи или и для чтения, и для записи и с заданным параметром совместного доступа.

Инициализирует новый экземпляр FileStream класса с заданным режимом создания, разрешением на чтение, запись и совместное использование, доступ к другим потокам FILESTREAM может иметь один и тот же файл, размер буфера, дополнительные параметры файла и размер выделения.

Создает доступный только для чтения поток FileStream.

Создает поток StreamReader с кодировкой UTF-8, который считывает данные из существующего текстового файла.

Создает доступный только для чтения поток FileStream.

Обновляет состояние объекта.

Заменяет содержимое заданного файла на содержимое файла, которое описано в текущем объекте FileInfo, удаляет исходный файл и создает резервную копию замененного файла.

Заменяет содержимое заданного файла на содержимое файла, которое описано в текущем объекте FileInfo, удаляет исходный файл и создает резервную копию замененного файла. Также позволяет определить, нужно ли игнорировать ошибки слияния.

Возвращает целевой объект указанной ссылки.

Применяет записи списка управления доступом (ACL), описанные объектом FileSecurity, к файлу, который описывается текущим объектом FileInfo.

Возвращает путь в виде строки. Используйте свойство Name для полного пути.

Методы расширения

Создает файловый поток с указанными свойствами и параметрами безопасности.

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

Обновлено примечание по этому решению: проверки с FileAccess.ReadWrite будет не только для чтения, поэтому решение было изменено для проверки с FileAccess.Read . Хотя это решение работает, потому что пытается проверить с FileAccess.Read произойдет сбой, если файл имеет блокировку записи или чтения, однако это решение не будет работать, если файл не имеет блокировки записи или чтения, т. е. он был открыт (для чтения или записи) с помощью FileShare.Читать или файловый.Писать доступ.

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

поймите, что вы сомневаетесь в использовании исключений, но вы не можете избегать их все время:

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

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

используйте это, чтобы проверить, заблокирован ли файл:

по соображениям производительности я рекомендую вам прочитать содержимое файла в той же операции. Вот несколько примеров:

возможно, вы могли бы использовать FileSystemWatcher и следите за измененным событием.

Я не использовал это сам, но, возможно, стоит попробовать. Если filesystemwatcher оказывается немного тяжелым для этого случая, я бы пошел на цикл try/catch/sleep.

единственный способ, о котором я знаю, - использовать Win32 exclusive lock API, который не слишком быстрый, но примеры существуют.

большинство людей, для простого решения этого, просто попробовать/поймать / спящие петли.

надеюсь, что это помогает!

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

используйте функцию ниже, например

многоразовый метод, который истекает через 2 секунды

вы можете вернуть задачу, которая дает вам поток, как только он становится доступным. Это упрощенное решение, но это хорошая отправная точка. Это потокобезопасными.

Вы можете использовать этот поток как обычно:

принятые ответы выше страдают проблемой, где, если файл был открыт для записи с помощью файла.Режиме чтения или если файл имеет атрибут только для чтения код не будет работать. Это модифицированное решение работает наиболее надежно, имея в виду две вещи (как и для принятого решения):

  1. Он не будет работать для файлов, которые были открыты с записи режим
  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?

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

Предоставляет свойства и методы экземпляра для создания, копирования, удаления, перемещения и открытия файлов, а также позволяет создавать объекты FileStream. Этот класс не наследуется.

Примеры

В следующем примере показаны некоторые основные члены FileInfo класса.

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

В этом примере создаются выходные данные, аналогичные приведенным ниже.

Комментарии

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

При выполнении нескольких операций над одним и тем же файлом может оказаться более эффективным использование FileInfo методов экземпляра вместо соответствующих статических методов File класса, поскольку проверка безопасности не всегда требуется.

Многие из FileInfo методов возвращают другие типы ввода-вывода при создании или открытии файлов. Эти другие типы можно использовать для дальнейшего управления файлом. Дополнительные сведения см. в разделе определенные FileInfo элементы, такие как Open ,, OpenRead OpenText , CreateText или Create .

По умолчанию всем пользователям предоставляется полный доступ на чтение и запись к новым файлам.

В следующей таблице описаны перечисления, используемые для настройки поведения различных FileInfo методов.

Перечисление Описание
FileAccess Указывает доступ к файлу для чтения и записи.
FileShare Указывает уровень доступа, разрешенный для уже используемого файла.
FileMode Указывает, будет ли содержимое существующего файла сохранено или перезаписано, и должны ли запросы на создание существующего файла вызывать исключение.

В членах, принимающих путь в качестве входной строки, этот путь должен иметь правильный формат или возникнет исключение. Например, если путь является полным, но начинается с пробела, путь не усекается в методах класса. Поэтому путь имеет неправильный формат и возникает исключение. Аналогично, путь или сочетание путей не могут быть полными и дважды. Например, "c:\temp c:\Windows" также вызывает исключение в большинстве случаев. При использовании методов, принимающих строку пути, убедитесь, что пути имеют правильный формат.

В членах, принимающих путь, путь может ссылаться на файл или только на каталог. Указанный путь может также ссылаться на относительный путь или путь в формате UNC для имени сервера и общего ресурса. Например, все следующие допустимые пути:

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

DirectoryСвойство получает объект, представляющий родительский каталог файла.

DirectoryNameСвойство получает полный путь к родительскому каталогу файла.

ExistsСвойство проверяет наличие файла перед его обработам.

IsReadOnlyСвойство извлекает или задает значение, указывающее, можно ли изменить файл.

LengthВозвращает размер файла.

NameВозвращает имя файла.

Конструкторы

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

Представляет полный путь к каталогу или файлу.

Первоначально заданный пользователем относительный или абсолютный путь.

Свойства

Получает или задает атрибуты для текущего файла или каталога.

Получает или задает время создания текущего файла или каталога.

Получает или задает время создания текущего файла или каталога в формате UTC.

Получает экземпляр родительского каталога.

Получает строку, представляющую полный путь к каталогу.

Получает значение, показывающее, существует ли файл.

Возвращает часть имени файла, включая начальную точку . даже если это полное имя файла, или пустая строка, если расширение отсутствует.

Получает полный путь к каталогу или файлу.

Возвращает или задает значение, позволяющее определить, является ли текущий файл доступным только для чтения.

Получает или задает время последнего доступа к текущему файлу или каталогу.

Получает или задает дату и время последнего доступа к заданному файлу или каталогу в формате всеобщего скоординированного времени (UTC).

Получает или задает время последней операции записи в текущий файл или каталог.

Получает или задает время последней операции записи в текущий файл или каталог в формате всеобщего скоординированного времени (UTC).

Получает размер текущего файла в байтах.

Если этот FileSystemInfo экземпляр представляет ссылку, возвращает путь к цели ссылки. Если ссылка не существует в FullName или этот экземпляр не представляет ссылку, возвращает null .

Получает имя файла.

Методы

Создает StreamWriter, который добавляет текст в файл, представленный этим экземпляром FileInfo.

Копирует существующий файл в новый файл и запрещает перезапись существующего файла.

Копирует существующий файл в новый файл и разрешает перезапись существующего файла.

Создает символическую ссылку, расположенную в FullName , указывающую на указанный объект pathToTarget .

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

Создает StreamWriter, который записывает новый текстовый файл.

Расшифровывает файл, зашифрованный текущей учетной записью с помощью метода Encrypt().

Удаляет файл без возможности восстановления.

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

Определяет, равен ли указанный объект текущему объекту.

Возвращает объект FileSecurity, который инкапсулирует записи списка управления доступом (ACL) для файла, описываемого текущим объектом FileInfo.

Получает объект FileSecurity, который инкапсулирует заданный тип записей списка управления доступом для файла, описываемого текущим объектом FileInfo.

Служит хэш-функцией по умолчанию.

Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра.

Устанавливает объект SerializationInfo с именем файла и дополнительными сведениями об исключении.

Возвращает объект Type для текущего экземпляра.

Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.

Создает неполную копию текущего объекта Object.

Создает неполную копию текущего объекта MarshalByRefObject.

Перемещает заданный файл в новое местоположение и разрешает переименование файла.

Перемещает указанный файл в новое расположение, предоставляя параметры для указания нового имени файла и перезаписи конечного файла, если он уже существует.

Открывает файл в заданном режиме.

Открывает файл в заданном режиме с доступом для чтения или записи, или и для чтения, и для записи.

Открывает файл в заданном режиме с доступом для чтения, записи или и для чтения, и для записи и с заданным параметром совместного доступа.

Инициализирует новый экземпляр FileStream класса с заданным режимом создания, разрешением на чтение, запись и совместное использование, доступ к другим потокам FILESTREAM может иметь один и тот же файл, размер буфера, дополнительные параметры файла и размер выделения.

Создает доступный только для чтения поток FileStream.

Создает поток StreamReader с кодировкой UTF-8, который считывает данные из существующего текстового файла.

Создает доступный только для чтения поток FileStream.

Обновляет состояние объекта.

Заменяет содержимое заданного файла на содержимое файла, которое описано в текущем объекте FileInfo, удаляет исходный файл и создает резервную копию замененного файла.

Заменяет содержимое заданного файла на содержимое файла, которое описано в текущем объекте FileInfo, удаляет исходный файл и создает резервную копию замененного файла. Также позволяет определить, нужно ли игнорировать ошибки слияния.

Возвращает целевой объект указанной ссылки.

Применяет записи списка управления доступом (ACL), описанные объектом FileSecurity, к файлу, который описывается текущим объектом FileInfo.

Возвращает путь в виде строки. Используйте свойство Name для полного пути.

Методы расширения

Создает файловый поток с указанными свойствами и параметрами безопасности.

Язык программирования C++. Лекции и упражнения. 6-е изд (Стивен Прата)

Программирование. Принципы и практика с использованием C++ (Бьярне Страуструп)

подскажите, что делает (return -1) и тогда соответственно (return 0)?

В моём случае ничего полезного.
return 0, используемое в функции main(), только-лишь сообщает операционной системе, что программа успешно завершилась.
return -1 могло бы использоваться для работы с внешними программами. Т. е. какая-нибудь внешняя программа могла бы использовать написанную мной, по -1 можно было бы легко выявить, что моя эта программа задачу свою не выполнила и, например, сообщить об этом пользователю. -1 необязательное значение, а взятое с потолка. Т. е. любое можно использовать, достаточно будет знать, что оно должно обозначить (в моём случае неоткрытие файла).

что то не пойму как организовать в проге проверку методом fail(). он пишется после цикла считывания с файла или само считывание пишется в- цикл() > ?

что то не пойму как организовать в проге проверку методом fail(). он пишется после цикла считывания с файла или само считывание пишется в- цикл() > ?

У меня в примере сначала проверяется, что файл успешно открыт. Потом проверяется fail , т. е. успешность прочитанности значения. В случае неуспеха выбирается поведение диагностики ошибки. В моём случае ошибке присваивается номер и запоминается в переменную ERROR.
fail переводится как неудача. Если компилятор прочитал что смог и всё поломалось, то или достигнут конец файла, или не соответствует тип для записи в переменную значения. Поскольку дальнейшее чтение не имеет смысла, нужно зафиксировать проблему удобным способом.

Если проверять на fail(), то это как проверять на eof().
Только fail() включает в себя и проверку на eof() и проверку на успешное считывание.

Я не могу понять, чего Вы понять не можете.

я написал программу в которой хотел, чтоб если на пути считывания f2.get()-ом в переменную типа чар попадала цифра, то считывание прекращалось и выводило на каком символе произошел конец. но у меня несколько раз, то ничего не выводило, то выводило все подряд до EOF

char — целочисленный тип.
цифра — целое число
Читаем в целочисленный тип целое число и ждём, что сломается? Не дождётесь.

Читайте также: