Как закрыть файл на сервере
Перейти к содержимому

Как закрыть файл на сервере

  • автор:

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)

date27.07.2021
useritpro
directoryWindows 10, Windows Server 2012 R2, Windows Server 2016
commentsкомментарий 51

Если вы администрируете общие сетевые папки Windows, скорее всего вы периодически сталкиваетесь с просьбами пользователей принудительно закрыть файлы, открытые (заблокированные) в сетевых папках другими пользователями. Обычно это связано с некорректной работой программы, неправильном завершении сессии пользователя или ситуациях, когда пользователь открыл файл и забыл закрыть его (ушел домой, в отпуск и т.д.). Во всех этих случаях файл в сетевой папке оказывается заблокированным, и другие пользователи не могут вносить в него изменения.

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

Вывод списка открытых файлов в сетевой папке Windows

Список открытых по сети файлов в Windows можно получить с помощью стандартной графической консоли Computer Management (Управление компьютером — compmgmt.msc ).

Запустите на файловом сервере консоль Computer Management (или подключитесь к нему консолью удаленно со своего компьютера) и перейдите в раздел System Tools -> Shared Folders -> Open files (Служебные программы -> Общие папки -> Открыты файлы). В правой части окна отображается список файлов на сервере, открытых удаленно. В данном списке указан локальный путь к файлу, имя учетной записи пользователя, количество блокировок и режим, в котором открыт файл (Read или Write+Read).

Открыты файлы на файловом сервере Windows

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

Openfiles /Query /fo csv |more

Openfiles /Query

Вы можете вывести список открытых файлов на сервере удаленно. Например, чтобы вывести все открытые по сети файлы на сервере 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 - отключение файла по id сессии

Можно принудительно сбросить все сессии и освободить все файлы, открытые определённым пользователем:
openfiles /disconnect /s mskfs01 /u corp\aivanova /id *

Get-SMBOpenFile: вывод списка открытых по сети файлов в PowerShell

В версии PowerShell в Windows Server 2012/Windows 8 появились командлеты для управления сетевыми файлами и папками на SMB сервере. Эти командлеты можно использовать чтобы удаленно закрыть открытые по сети файлы.

Список открытых файлов можно получить с помощью командлета Get-SMBOpenFile. Чтобы закрыть файл (сбросить подключение), используется Close-SmbOpenFile.

Для вывода полного списка открытых файлов на сервере, выполните команду:

Get-SMBOpenFile вывод списка открытых файлов на SMB сервере с помощью powershell

Команда возвращает ID файла, ID сессии и полное имя файла.

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

poweshell вывод список пользователей, которые открыли файлы в сетевой папке windows

Можно вывести все файлы, открытые определенным пользователем:

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

Get-SmbOpenFile вместе с out-gridview - powershell скрипт с графическим интерефейсом по выбору и принудительному закрыттию заблокированных (открытых) файлов в windows

Как удаленно закрыть открытые 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 . В результате вы разблокировали открытый файл. Теперь его могут открыть другие пользователи.

Get-SMBOpenFile - удаленное управление открытых файлов

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

Get-SMBOpenFile -CIMSession $sessn | where <$_.ClientUserName –like "*ipivanov*">|Close-SMBOpenFile -CIMSession $sessn

Предыдущая статьяПредыдущая статья Следующая статья Следующая статья

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *