PHP | Открытие, чтение, закрытие файлов
В этой уроке мы рассмотрим несколько функций, с помощью которых будем открывать, читать и закрывать файлы на сервере.
Функция PHP fopen()
Функция fopen() в PHP — это встроенная функция, которая используется для открытия файла или URL-адреса. В случае сбоя, она возвращает FALSE и выдаёт ошибку. Если вам нужно скрыть вывод ошибки добавьте символ ‘@’ перед именем функции.
Синтаксис
Параметры
- filename : Обязательный параметр, определяющий файл.
- mode : Обязательный параметр, определяющий тип доступа к файлу или потоку.
Он может иметь следующие возможные значения:
- «r»: Открывает файл только для чтения; помещает указатель в начало файла.
- «r+»: Окрывает файл для чтения и записи; помещяет указатель в начало файла.
- «w»: Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длинны. Если файл не существует — пробует его создать.
- «w+»: Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длинны. Если файл не существует — пробует его создать.
- «a»: Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует — пытается его создать.
- «a+»: Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует — пытается его создать.
- «x»: Создаёт и открывает только для записи. Он создает новый файл и возвращает FALSE и ошибку, если файл уже существует.
- «x+»: Создаёт и открывает для чтения и записи. Создает новый файл и возвращает FALSE и ошибку, если файл уже существует.
- «c»: Открывает файл только для записи. Если файл не существует, то он создается. Если же файл существует, то он не обрезается (в отличие от ‘w’), и вызов к этой функции не вызывает ошибку (также как и в случае с ‘x’).
- «c+»: Открывает файл для чтения и записи; в остальном имеет то же поведение, что и ‘c’.
- «e»: Установить флаг close-on-exec (закрыть при запуске) на открытый файловый дескриптор. Доступно только в PHP скомпилированном на системах поддерживающих POSIX.1-2008.
В этом уроке мы будем использовать текстовый файл mane.txt:
В следующем примере, ипользуя функцию fopen() , откроем файл «mane.txt» в режиме чтения:
Пример
Конструкция or die(«Невозможно открыть файл!») позволяет прекратить работу скрипта и вывесте некоторое сообщение об ошибке, если функция fopen не смогла открыть файл.
Чтение файла — fread()
Функция fread() считывает информацию из открытого файла.
Первый параметр fread() содержит имя файла для чтения, а второй параметр указывает максимальное количество байтов для чтения.
Следующий код PHP читает файл «mane.txt» до конца:
Закрытие файла — fclose()
Функция fclose() используется, чтобы закрыть открытый файл.
Синтаксис
Функция закрывает файл, на который указывает handle.
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Дескриптор должен указывать на файл, открытый ранее с помощью функции fopen() или fsockopen() .
Примечание: Хорошая практика программирования — закрывать все файлы после того, как вы закончили с ними работать. Дело в том, что открытый файл на вашем сервере продолжает занимать ресурсы!
Однострочное чтение — fgets()
Функция fgets() используется для чтения одной строки из файла.
В приведенном ниже примере выводится первая строка файла mane.txt:
Пример
Примечание: После вызова функции fgets() указатель файла переместился на следующую строку.
Проверка окончания файла — feof()
Функция feof() определяет, достигнут ли конец файла. Если в указанном дескрипторе, определяется окончание файла, возвращает True . В противном случае, False .
ILYA Sazonov: ITPro
Периодически наблюдаю проблему: на терминальном сервере пользователь открывает файлы на сетевой шаре, далее закрываем сессию пользователя, проблема – некоторые файлы остаются в статусе открытых и заблокированных на файловом сервере.
Через какой-то достаточно длительный таймаут файлы конечно будут закрыты, но если пользователя или пользователей «выгоняли», потому что требовалось заменить эти файлы (например, модули программы), то нужно как можно быстрее разблокировать файлы. Сделать это можно принудительно удалив открытые коннекты к файлам.
Способ 1. Классический.
Используем (даже удалённо) стандартную утилиту openfiles.
Способ 2. Новый
Начиная с Windows 8/2012, в Powershell появился стандартный модуль SMBShare, который имеет командлеты с функциональностью аналогичной openfiles:
Get-SMBOpenFile – выполняет вывод открытых файлов, позволяет использовать некоторые встроенные фильтры.
Close-SmbOpenFile – позволяет закрыть подключение к файлу.
Способ 3. Новый WMI.
Всё аналогично второму способу: начиная с Windows 8/2012, в SMB 3.0 появился WMI класс MSFT_SmbOpenFile – именно на его основе работают новые командлеты Get-SMBOpenFile и Close-SmbOpenFile. Если вы хотите, то можете использовать WMI напрямую:
Закрытие открытого файла
Закрыть общие файлы или папки можно с помощью оснастки «Общие папки» консоли MMC или с использованием командной строки.
При закрытии файла или папки подключенные к нему пользователи отключаются. Закрытие общего файла без предупреждения может привести к утрате данных пользователями. По возможности следует уведомлять пользователей о предстоящем отключении и закрытии файла.
Закрытие открытого файла
Откройте «Управление компьютером».
Если появится диалоговое окно Управление учетными записями пользователей, убедитесь, что в окне указано нужное действие, и выберите ответ Да.
В дереве консоли щелкните Служебные, Общие папки, а затем — Открытые файлы.
Выполните одно из следующих действий.
-
Чтобы закрыть все открытые файлы и папки, выберите в меню Действие команду Отключить все открытые файлы.
Чтобы открыть окно командной строки с более высоким уровнем прав, нажмите кнопку Пуск, выберите Все программы, Стандартные, щелкните правой кнопкой мыши пункт Командная строка, а затем выберите пункт Выполнить от имени администратора.
Если появится диалоговое окно Управление учетными записями пользователей, убедитесь, что в окне указано нужное действие, и выберите ответ Да.
Например, чтобы закрыть открытый файл с идентификатором myfile_id, введите следующую команду:
Отображение имен всех открытых общих файлов или папок на сервере, а также числа блокировок для каждого файла или папки, если они установлены.
Динамически назначаемый идентификатор общего файла или папки.
Закрытие общего файла или папки и удаление блокировок файла. Эту команду следует выполнять на сервере, где находятся общие ресурсы.
Управление открытыми файлами на файловом сервере Windows (SMB)
27.07.2021
itpro
Windows 10, Windows Server 2012 R2, Windows Server 2016
комментарий 51
Если вы администрируете общие сетевые папки Windows, скорее всего вы периодически сталкиваетесь с просьбами пользователей принудительно закрыть файлы, открытые (заблокированные) в сетевых папках другими пользователями. Обычно это связано с некорректной работой программы, неправильном завершении сессии пользователя или ситуациях, когда пользователь открыл файл и забыл закрыть его (ушел домой, в отпуск и т.д.). Во всех этих случаях файл в сетевой папке оказывается заблокированным, и другие пользователи не могут вносить в него изменения.
В этой статье мы покажем, как получить список открытых файлов на файловом сервере Windows, узнать какие пользователи их используют, и способы сброса файловых сессий для разблокировки открытых файлов.
Вывод списка открытых файлов в сетевой папке Windows
Список открытых по сети файлов в Windows можно получить с помощью стандартной графической консоли Computer Management (Управление компьютером — compmgmt.msc ).
Запустите на файловом сервере консоль Computer Management (или подключитесь к нему консолью удаленно со своего компьютера) и перейдите в раздел System Tools -> Shared Folders -> Open files (Служебные программы -> Общие папки -> Открыты файлы). В правой части окна отображается список файлов на сервере, открытых удаленно. В данном списке указан локальный путь к файлу, имя учетной записи пользователя, количество блокировок и режим, в котором открыт файл (Read или Write+Read).

Этот же список открытых файлов можно получит с помощью встроенной консольной утилиты Openfiles. Например, с помощью следующей команды можно получить id сессии, имя пользователя и полный локальный путь к открытому файлу:
Openfiles /Query /fo csv |more

Вы можете вывести список открытых файлов на сервере удаленно. Например, чтобы вывести все открытые по сети файлы на сервере mskfs01, выполните:
Openfiles /Query /s mskfs01 /fo csv
Определяем пользователя, который открыл файл в сетевой папке с помощью Openfiles
Чтобы удаленно определить пользователя, который открыл (заблокировал) файл cons.adm в сетевой папке на сервере mskfs01, выполните команду:
Openfiles /Query /s mskfs01 /fo csv | find /i «cons.adm»
Можно указать только часть имени файла. Например, чтобы узнать, кто открыл xlsx файл, в имени которого есть строка farm, воспользуйтесь таким конвейером:
Openfiles /Query /s mskfs01 /fo csv | find /i «farm»| find /i «xlsx»
Можно, конечно найти открытый файл и в графической консоли Computer Management, но это менее удобно (в консоли нет возможности поиска).
Как принудительно закрыть открытый файл в Windows?
Чтобы закрыть открытый файл, нужно найти его в списке файлов секции Open Files и в контекстном меню выбрать пункт “Close Open File”.

Если на файловом сервере сотни открытых файлов, найти их в консоли будет непросто. Удобнее воспользоваться утилитой Openfiles. Как мы уже говорили, она возвращает ID сессии открытого файла. Вы можете принудительно закрыть файл и сбросить подключение пользователя по ID SMB сессии. Сначала нужно определить ID сессии открытого файла:
Openfiles /Query /s mskfs01 /fo csv | find /i «farm»| find /i «.xlsx»
Теперь можно принудительно отключить пользователя по полученному идентификатору SMB сессии:
Openfiles /Disconnect /s mskfs01 /ID 67109098

Можно принудительно сбросить все сессии и освободить все файлы, открытые определённым пользователем:
openfiles /disconnect /s mskfs01 /u corp\aivanova /id *
Get-SMBOpenFile: вывод списка открытых по сети файлов в PowerShell
В версии PowerShell в Windows Server 2012/Windows 8 появились командлеты для управления сетевыми файлами и папками на SMB сервере. Эти командлеты можно использовать чтобы удаленно закрыть открытые по сети файлы.
Список открытых файлов можно получить с помощью командлета Get-SMBOpenFile. Чтобы закрыть файл (сбросить подключение), используется Close-SmbOpenFile.
Для вывода полного списка открытых файлов на сервере, выполните команду:

Команда возвращает ID файла, ID сессии и полное имя файла.
Можно вывести список открытых файлов с именами пользователей и компьютеров (IP адресами):

Можно вывести все файлы, открытые определенным пользователем:
Get-SMBOpenFile –ClientUserName «corp\aaivanov» |select ClientComputerName,Path
или с определенного компьютера (сервера):
Get-SMBOpenFile –ClientComputerName 192.168.12.170| select ClientUserName,Path
Можно вывести список открытых файлов по шаблону. Например, все открытые по сети exe файлы:
или файлы с определенным именем:
Чтобы закрыть файл используется командлет Close-SmbOpenFile . Закрыть файл можно по ID:
Close-SmbOpenFile -FileId 4123426323239
Но обычно удобнее закрыть файл по имени:
Get-SmbOpenFile | where <$_.Path –like "*prog.xlsx">| Close-SmbOpenFile -Force
С помощью Out-GridView можно сделать простую графическую форму для поиска и закрытия файлов. Следующий скрипт выведет список открытых файлов. Администратор должен с помощью фильтров в таблице Out-GridView найти, выделить нужные файлы и нажать ОК. В результате выбранные файлы будут принудительно закрыты.
Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessionID| Out-GridView -PassThru –title “Select Open Files”|Close-SmbOpenFile -Confirm:$false -Verbose

Как удаленно закрыть открытые SMB файлы с помощью PowerShell?
Командлеты Get-SMBOpenFile и Close-SmbOpenFile можно использовать чтобы удаленно найти и закрыть открытые файлы. Сначала нужно подключиться к удаленному SMB серверу Windows через CIM сессию:
$sessn = New-CIMSession –Computername mskfs01
Следующая команда найдет SMB сессию для открытого файла *pubs.docx и завершит ее.
Get-SMBOpenFile -CIMSession $sessn | where <$_.Path –like "*pubs.docx">| Close-SMBOpenFile -CIMSession $sessn
Подтвердите закрытие файла, нажав Y . В результате вы разблокировали открытый файл. Теперь его могут открыть другие пользователи.

С помощью PowerShell вы можете закрыть и разблокировать на файловом сервере все файлы, открытые определенным пользователем (пользователь ушел домой и не освободил файлы). Например, чтобы сбросить все файловые сессии для пользователя ipivanov, выполните:
Get-SMBOpenFile -CIMSession $sessn | where <$_.ClientUserName –like "*ipivanov*">|Close-SMBOpenFile -CIMSession $sessn
Предыдущая статья Следующая статья