Грамотная работа с файлами исключительная блокировка файлов PHP


Оглавление (нажмите, чтобы открыть):

Работа с файлами

Работа с файлами — важный инструмент PHP.

Включение внешних файлов

В каждый PHP-документ можно включить файл с помощью инструкции include(). Её аргумент: путь к файлу. Этой инструкцией удобно пользоваться при наличии одинаковых кусков кода во многих PHP-программах. Содержимое включаемого файла обрабатывается как простой HTML-текст. Для того, чтобы содержимое этого файла обрабатывалось как PHP-программа, нужно обрамлять его открывающим и закрывающим тегами PHP.

Пример 1

Включаемый файл top.php с PHP-программой:

. Общее приветствие.

. Основная часть.

В данном случае результат будет тем же, если включаемый файл top.php содержит только строку HTML-текста:

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

Пример 2

Включаемый файл top.php с PHP-программой:

Включаемый файл вернул 56

Инструкцию include() можно использовать внутри цикла. В цикле include() выполняется при каждой итерации. Это можно использовать для включения нескольких файлов. Например:

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

Оператор include() также можно включать в тело условного оператора.

Несмотря на сходство по внешнему виду с функцией, include() функцией не является, а представляет собой специальную конструкцию языка.

Для указания что файл нужно подключать только один раз используется оператор include_once()

Анализ файлов

PHP содержит множество функций, дающих информацию о файлах. Наиболее употребимыми являются:

  • file_exists() — определяет существование файла. Например:
  • is_file() — определяет, является ли исследуемый объект файлом. Например:
  • is_dir() — определяет, является ли исследуемый объект каталогом. Например:
  • is_readable() — определяет, доступен ли файл для чтения. Например:
  • is_writable() — определяет, доступен ли файл для записи. Например:
  • filesize() — определяет размер файла в байтах.
  • filemtime() — определяет дату и время последнего изменения файла.
  • fileatime() — определяет дату и время последнего обращения к файлу.

Время возвращается в формате Unix, т.е. представляет собой количество секунд, прошедших после 1 января 1970 г. В примере 2 это число преобразуется в понятный для человека формат с помощью функции date( ). Подробнее об этой функции можно узнать в разделе «Дополнительные возможности».

Пример 3

Внимание! С удаленными файлами эти функции не работают. Их можно применять только к локальной файловой системе.

Управление файлами

PHP содержит множество функций управления файлами. Наиболее употребимыми являются:

  • touch() — создает пустой файл с заданным именем. Если такой файл уже существует, то функция изменит дату модификации. Например:
  • copy() — копирует файл. Для копирования файлов в php применяется функция copy ($source, $result). Ей нужно передать лишь два параметра — источник $source и имя файла-копии — $result. Стоит отметить, что следует указывать полные адреса к файлам. Пример применения функции copy:

  • unlink() — удаляет заданный файл. Например:
  • fopen( ) — открывает локальный или удаленный файл и возвращает указатель на него. Указатель используется во всех операциях с содержимым файла. Аргументы: имя файла и режим открытия.

    r

    чтение. Указатель файла устанавливается на его начало

    r+

    чтение и запись. Указатель файла устанавливается на его начало

    w

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

    w+

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

    a

    запись. Указатель файла устанавливается на его конец. Если файл с указанным именем не существует, функция пытается его создать

    a+

    чтение и запись. Указатель файла устанавливается на его конец. Если файл с указанным именем не существует, функция пытается его создать

    Если открыть файл не удалось, то можно прервать выполнение программы. Например:

  • fclose() — закрывает файл. Аргумент: указатель файла, полученный ранее от функции fopen(). Например:
  • feof() — проверка конца файла. Аргумент: указатель файла.
  • fgetc() — чтение очередного символа из файла. Аргумент: указатель файла.
  • fgets() — чтение очередной строки файла. Аргументы: указатель файла и длина считываемой строки. Операция прекращается либо после считывания указанного количества символов, либо после обнаружения конца строки или файла.

    Пример 4


    Пример 5


    Пример 6

    1

    Можно читать, нельзя писать

    2

    Нельзя ни читать, ни писать

    3

    Снятие блокировки

    Пример 7

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

    В PHP версии >= 4.3.0 появились новые удобные функции работы с файлами:

    • file_get_contents() — прочитать весь файл или URL
    • file_put_contents() — записать файл

    Работа с каталогами

    В PHP есть несколько функций для работы с каталогами:

      mkdir() — создание каталога. Аргументы: путевое имя каталога и режим доступа. Режим доступа — восьмеричное число из трех цифр с ведущим нулем. Первая цифра — право доступа для владельца, вторая — для группы, третья — для всех остальных. В системе Windows режим доступа игнорируется. В системе UNIX определены следующие права доступа:

    0

    Нет доступа

    1

    Доступ для запуска

    2

    Доступ для записи

    3

    Доступ для записи и запуска

    4

    Доступ для чтения

    5

    Доступ для чтения и запуска

    6

    Доступ для чтения и записи

    7

    Полный доступ

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

  • rmdir() — удаление каталога. Аргумент: путевое имя каталога. Удалить можно лишь пустой каталог при наличии права на это. При успешном выполнении функция возвращает true.
  • opendir() — открытие каталога. Аргумент: путевое имя каталога. В случае возникновения ошибки функция возвращает false. Ошибка при открытии может быть вызвана тем, что каталог не существует или программа не имеет права его читать.
  • readdir() — чтение каталога. Аргумент: путевое имя каталога. Возвращает строку, содержащую имя найденного файла или подкаталога. По достижении конца каталога функция возвращает false.

    Пример 8

    Проверочное выражение цикла сработает не так, как хотелось бы, если в каталоге есть файл с именем «0». В таком случае имя «0» будет преобразовано в 0, что вызовет завершение цикла. Избежать подобного можно, если принять дополнительные меры безопасности, изменив проверочное выражение:

    Помимо использования функция fgetc() fgets() fgetss(), Вы можете использовать
    $file = file($filename). Она читает $filename в массив($file).

    Передача файла с сервера. Скачать файл. DownLoad.

    Ручной Download, или как скриптом открыть пользователю окошко сохранения файла. Чтобы в браузере открылся диалог «Сохранить файл» с названием файла file.dat, скрипт должен послать такие заголовки:

    Готовый пример отправки файла с диска: Не мешало бы также ссылаться на скрипт как https://. /download.php?file.dat, иначе браузеры, основанные на Mozilla, могут попытаться записать файл как file.dat.php. или указать атрибут download: Примечание: Не используйте заголовок header(«Cache-Control: no-cache») в таких скриптах, большинство версий Internet Explorer не смогут скачать файл.

    Следующий пример скрипта демонстрирует как организовать поддержку докачки:

    Предполагается, что $cd — путь к файлу, $fn — имя файла Как передать файл на сервер?

    Функции для работы с каталогами

    • chdir() — Сменить каталог boolean chdir (string str)

    Изменяет текущий каталог PHP на указанный в качестве параметра str. Возвращает TRUE в случае успешного завершения, FALSE в случае возникновения ошибки
    chroot() — Сменить корневой каталог boolean chroot (string str)

    Изменяет корневой каталог текущего процесса на переданный в качестве параметра str. Возвращает TRUE в случае успешного завершения, FALSE в случае возникновения ошибки..

    Замечание: Для Windows-платформ эта функция не реализована.
    closedir() — Освободить дескриптор каталога void closedir (resourse catalog)

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

    dir — Класс directory

    Псевдо-объектно-ориентированный механизм для чтения каталога, переданного в параметре каталог. С момента открытия каталога становятся доступными два свойства класса. Свойство «handle» может быть использовано с другими функциями для работы с каталогами, например, с функциями readdir(), rewinddir() и closedir(). Свойство «path» содержит путь к открытому каталогу. Доступны три метода: read, rewind and close.

    Пожалуйста, обратите внимание на способ, которым осуществляется проверка значения, возвращаемого методами класса dir() в примере, приведенном ниже. В этом примере проводится проверка значения на идентичность (выражения идентичны, когда они равны и являются одного типа — за более подробной информацией обратитесь к главе Операторы сравнения) значению FALSE, поскольку в ином случае, любой элемент каталога, чье имя может быть выражено как FALSE, остановит цикл.

    Замечание: Порядок, в котором метод «read» возвращает элементы каталога, зависит от операционной системы.

    Замечание: Также, PHP автоматически определяет внутренний класс Directory, что означает, что вы не сможете определять собственные классы с таким же именем.

    getcwd() — Получить имя текущего рабочего каталога string getcwd (void)

    Возвращает имя текущего рабочего каталога.

    opendir() — Открыть каталог resourse opendir (string path)

    Возвращает дескриптор каталога для последующего использования с функциями closedir(), readdir() и rewinddir().

    Если путь не существует или каталог, расположенный по указанному пути, не может быть открыт вследствие правовых ограничений или ошибок файловой системы, функция opendir() возвращает значение FALSE и генерирует сообщение PHP об ошибке уровня E_WARNING. Вы можете запретить вывод сообщения об ошибке, предварив имя функции opendir() символом ‘@’.

    Начиная с версии PHP 4.3.0, параметр путь может также являться любым URL’ом, обращение к которому приводит к получению списка его файлов и каталогов. Однако, данный способ работает только при использовании url-упаковщика file://. В версии PHP 5.0.0 была добавлена поддержка url-упаковщика ftp://.

    readdir — Получить элемент каталога по его дескриптору string readdir (resource catalog)

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

    Обратите внимание на способ проверки значения, возвращаемого функцией readdir() в приведенном ниже примере. В этом примере осуществляется проверка значения на идентичность (выражения идентичны, когда они равны и являются значениями одного типа — за более подробной информацией обратитесь к главе Операторы сравнения) значению FALSE, поскольку в ином случае, любой элемент каталога, чье имя может быть выражено как FALSE, остановит цикл (например, элемент с именем «0»).

    Обратите внимание, что функция readdir() также возвращает элементы с именами, и, если вы не хотите получать эти значения, просто отбрасывайте их:

    rewinddir() — Сбросить дескриптор каталога void rewinddir (resource catalog)

    Сбрасывает поток каталога, переданный в параметре catalog таким образом, чтобы тот указывал на начало каталога

    scandir() — Получить список файлов и каталогов, расположенных по указанному пути array scandir (string catalog [, int order])

    Возвращает массив, содержащий имена файлов и каталогов, расположенных по пути, переданном в параметре catalog. Если каталог не является таковым, функция возвращает логическое значение FALSE и генерирует сообщение об ошибке уровня E_WARNING.

    По умолчанию, сортировка производится в алфавитном порядке по возрастанию. Если указан необязательный параметр order (равен 1), сортировка производится в алфавитном порядке по убыванию. Пример кода

    PHP file_put_contents Блокировка файлов

    The Senario:

    У вас есть файл со строкой (средняя оценка предложения) в каждой строке. Для аргументов давайте скажем, что этот файл имеет размер 1 Мб (тысячи строк).

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

    Вопросы:

    Есть ли у сервера «PHP», «OS» или «httpd» и т. д. уже существующие системы, чтобы остановить такие проблемы (чтение /запись на полпути через запись)?

    Если да, объясните, как это работает, и дайте примеры или ссылки на соответствующую документацию.

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

    Мои предположения и другая информация:

    На сервере, на котором работает сервер, работают PHP и Apache или Lighttpd.

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

    Я занимаюсь только написанием и чтением PHP в текстовом файле и, в частности, функциями «fopen» /«fwrite» и в основном «file_put_contents». Я просмотрел документацию «file_put_contents», но не нашел уровня детализации или хорошего объяснения того, что означает или делает флаг «LOCK_EX».

    Сценарий — пример худшего сценария, в котором я предполагаю, что эти проблемы чаще возникают из-за большого размера файла и способа редактирования данных. Я хочу узнать больше об этих проблемах и не хочу или не нуждаюсь в ответах или комментариях, таких как «использовать mysql» или «почему вы это делаете», потому что я этого не делаю, я просто хочу узнать о чтении /записи файла с PHP и, похоже, не смотрят в нужные места /документацию, и да, я понимаю, что PHP не идеальный язык для работы с файлами таким образом.

    4 ответа

    Существует несколько проблем с исходным предлагаемым подходом:

    Во-первых, некоторые UNIX-подобные системы, такие как Linux, возможно, не поддерживают блокировку. ОС не блокирует файлы по умолчанию. Я видел, что системные вызовы являются NOP (без операции), но это несколько лет назад, поэтому вам нужно проверить, соблюден ли блокировка, установленная вашим экземпляром приложения, другим экземпляром. (т. е. 2 одновременных посетителей). Если блокировка все еще не реализована [она, скорее всего, есть], ОС позволяет перезаписать этот файл.

    Чтение больших файлов по очереди невозможно по соображениям производительности. Я предлагаю использовать file_get_contents (), чтобы загрузить весь файл в память, а затем взорвать (), чтобы получить строки. Кроме того, используйте fread () для чтения файла в блоках. Цель состоит в том, чтобы свести к минимуму количество прочитанных вызовов.

    Что касается блокировки файлов:

    LOCK_EX означает исключительную блокировку (обычно для записи). Только один процесс может содержать исключительную блокировку для данного файла в данный момент времени. LOCK_SH является общей блокировкой (обычно для чтения). Более одного процесса могут содержать общую блокировку для данного файла в данный момент времени. LOCK_UN разблокирует файл. Разблокировка выполняется автоматически, если вы используете file_get_contents () https://en.wikipedia.org/wiki/File_locking#In_Unix-like_systems

    Элегантное решение

    PHP поддерживает фильтры потока данных, которые предназначены для обработки данных в файлах или с других входов. Возможно, вы захотите создать один такой фильтр правильно, используя стандартный API. https://php.net/manual/en/function.stream-filter -register.php https://php.net/manual/en/filters.php

    Альтернативное решение (в 3 этапа):

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

    Для файлов размером до нескольких МБ прочитайте весь файл в памяти и затем обработайте его (file_get_contents () + explode () + foreach ())

    Для больших файлов читайте файл в блоках (т.е. 1024 байта) и обрабатывайте + записывайте в режиме реального времени каждый блок как чтение (осторожно о последней строке, которая не заканчивается на \ n. обрабатывается в следующей партии)

    Я знаю, что это возраст, но на случай, если кто-то столкнется с этим. ИМХО способ сделать это так:

    1) Откройте исходный файл (например, original.txt) с помощью file_get_contents (‘original.txt’).

    2) Внесите изменения /изменения.

    3) Используйте file_put_contents (‘original.txt.tmp’) и напишите его во временном файле original.txt.tmp.

    4) Затем переместите файл tmp в исходный файл, заменив исходный файл. Для этого вы используете rename (‘original.txt.tmp’, ‘original.txt’).

    Преимущества: Пока файл обрабатывается и записывается в файл, он не заблокирован, а другие могут читать старый контент. По крайней мере, при переименовании ящиков Linux /Unix это атомная операция. Любые прерывания во время записи файла не касаются исходного файла. Только после того, как файл полностью записан на диск, он перемещается. Более интересно прочитать об этом в комментариях к https://php.net/manual/en/function.rename.php

    В документации PHP для file_put_contents () вы можете найти в пример # 2 использование LOCK_EX , просто:

    LOCK_EX — константа со значением integer , чем может использоваться для некоторых функций в побитовые .

    Существует также специальная функция для управления блокировкой файлов: flock () способ.

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

    1. Пример сценария 1: чтение файла
    2. Пример сценария 2: чтение файла
    3. Пример сценария 1: записывает изменения в файл
    4. Пример сценария 2: перезаписывает изменения экземпляра первого скрипта в файл со своими собственными изменениями (так как на этом этапе его чтение стало устаревшим).

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

    Грамотная работа с файлами: исключительная блокировка файлов. Удаляем заблокированные файлы

    Excel для Office 365 Word для Office 365 PowerPoint для Office 365 Excel 2020 Word 2020 PowerPoint 2020 Excel 2020 Word 2020 PowerPoint 2020 Excel 2013 Word 2013 PowerPoint 2013 Excel 2010 Word 2010 PowerPoint 2010 Office 2010 Меньше

    Файлы, созданные в предыдущих версиях Office (например, документы Word 95), по умолчанию открываются в режиме защищенного просмотра с отключенными возможностями редактирования.

    Функция блокировки файлов запрещает открывать файлы устаревших типов и приводит к их открытию в режиме защищенного просмотра (при этом команды «Сохранить» и «Открыть» отключены). В коде, который открывает и сохраняет файлы в устаревших форматах, есть уязвимости, которые могут быть использованы злоумышленниками. Таким образом, они представляют собой угрозу безопасности, которой следует по возможности избегать.

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

    Ниже приведены примеры панели сообщений для блокировки файлов. Желтый значок щита указывает на то, что файл можно редактировать, а красный — на то, что это запрещено.

    Редактирование заблокированного файла

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

    На вкладке Файл выберите пункт Параметры .

    Выберите пункт , нажмите кнопку и выберите пункт Параметры блокировки файлов .

    Просмотр и изменение параметров блокировки файлов в центре управления безопасностью

    Откройте приложение Office.

    На вкладке Файл выберите пункт Параметры .

    Выберите пункт Центр управления безопасностью , нажмите кнопку Параметры центра управления безопасностью. и выберите пункт Параметры блокировки файлов .

    В списке Тип файла установите и снимите флажки Открыть и Сохранить для типов файлов, которые нужно заблокировать или разрешить.

    Примечание: Флажок Открыть невозможно установить, если не установлен флажок Сохранить .

    Описание параметров блокировки файлов

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

    Открывать выбранные типы файлов в режиме защищенного просмотра. Файлы выбранных типов открываются в режиме защищенного просмотра. Кнопка Разрешить редактирование отключена на панели сообщений и в представлении Backstage.

    Открывать выбранные типы файлов в режиме защищенного просмотра и разрешать редактирование . Файлы выбранных типов открываются в режиме защищенного просмотра. Кнопка Разрешить редактирование включена на панели сообщений и в представлении Backstage.

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

    Непосредственное использование в Unix только функций открытия, закрытия, записи в файл и чтения из файла не обеспечивает полных возможностей совместного использования файлов. Для управления совместным доступом к открытым файлам Unix содержит дополнительные средства, обеспечиваемые через системную функцию fcntl. Функция эта имеет прототип

    int fcntl(int handle, int cmd, . . .).

    Параметр cmd задает операции, которые необходимо выполнить над файлом, указанным аргументом handle . Третий аргумент этой функции, который может быть указан после cmd , зависит от конкретного значения операции cmd . Имеется целый ряд возможных значений для аргумента операции функции fcntl, но большинство из них не будет рассматриваться здесь. Ограничимся только значениеми, относящимися к взаимной блокировке файлов и их записей. В этом случае функция fcntl приобретает вид

    int fcntl(int handle, int cmd, struct flock *ldata).

    Для этого варианта имеем три основных значения аргумента cmd . Они обозначаются символическими константами F_SETLK, F_SETLKW и F_GETLK. Структуры flock данных описываются в заголовочном файле в виде

    l _type; // тип блокировки

    short l _whence; // код базовой позиции для отсчета смещения

    off_t l _start; // смещение относительно базовой позиции

    off_t l _len; // сколько байтов находится в заблокированной области

    pid_t l _pid; // PID процесса, который блокировал файл

    Сами символические константы операций блокировок обозначают следующее. Константа F_SETLK задает попытку применить блокировку к файлу и немедленно возвратить управление либо же отменить блокировку, если это действие задано типом блокировки, равным F_UNLCK. При неудачной попытке наложения блокировки с операцией, заданной константой F_SETLK, функция fcntl возвращает код -1. Константа F_SETLKW приказывает попытаться применить блокировку к файлу и приостановить работу, если блокировка уже наложена другим процессом. Константа F_GETLK делает запрос на получение описания блокировки, отвечающей данным в аргументе ldata (возвращаемая информация описывает первую блокировку, препятствующую наложению блокировки, которая задается структурой ldata ).

    Код базовой позиции для отсчета смещения задает либо начальную позицию в файле (константой SEEK_SET), либо текущую позицию в нем (константой SEEK_CUR), либо позицию конца файла (константой SEEK_END).

    В пояснение описанных деталей отметим, что средства Unix позволяют управлять совместным доступом не только ко всему файлу, но и к отдельным участкам его. В частности, разрешить другим процессам только читать отдельные участки файла, а другим, может быть, разрешить изменять их. Поэтому указанные средства содержат не только указание разрешения вида доступа или соответственно запрета (блокировки) доступа, но и описание участка, к которому относится такой запрет. Именно с этой целью в состав структуры flock включены поля l_whence , l_start , l_len , причем поле l_len задает длину участка, на который распространяется действие конкретного вызова функции fcntl ; поле l_start задает начальное смещение рассматриваемого участка относительно точки позиции, указанной параметром l_ whence . Последний, в свою очередь, значениями констант задает отсчет позиции относительно начала файла, относительно текущего положения указателя позиции в нем или относительно конца файла. В качестве указанных констант могут быть взяты соответственно значения 0, 1, 2 или именованные константы SEEK_SET, SEEK_CUR, SEEK_END из заголовочного файла stdio.h. Поле l_len может быть задано числом 0, тогда блокировка распространяется от указанного в структуре начала файла до его конца (причем при дальнейшем увеличении файла в процессе работы с ним эта блокировка распространяется дальше – до текущего конца файла).

    В структуре данных flock тип блокировки, указываемый полем l_type , задается символическими константами, предварительно описанными в заголовочном файле. Эти константы следующие: F_RDLCK – установить на указанную в структуре область данных блокировку чтения; F_WRLCK – установить на указанную в структуре область данных блокировку записи; F_UNLCK – снять блокировку с указанной области. Функция fcntl может быть использована многократно для различных участков файла и для них с ее помощью могут быть установлены, изменены или сняты определенные виды блокировок.

    Блокировка по чтению (константой F_RDLCK) может быть установлена только в том случае, если файл, на который она устанавливается текущей программой, открыт для чтения (т.е. с режимом O_RDONLY или O_RDWR). Блокировка по записи (константой F_WRLCK) может быть установлена только, если файл, на который она устанавливается текущей программой, открыт данной программой для записи (т.е. с режимом O_WRONLY или O_RDWR).

    Блокировка чтения, задаваемая константой F_RDLCK, просто предотвращает установку другими процессами блокировки записи. Несколько процессов могут одновременно выполнять блокировку чтения для одного и того же участка файла. Блокировка по чтению может использоваться, чтобы предотвратить обновление данных, не скрывая их от просмотра другими процессами. Блокировка записи, задаваемая константой F_WRLCK, предотвращает установку другими процессами блокировок чтения и записи для файла. Для заданного участка файла может существовать только одна блокировка записи одновременно. Блокировка записи может использоваться для запрещения просмотра участков файла при выполнении обновлений.

    Блокировка по чтению на участок файла может устанавливаться независимо различными процессами, но блокировку по записи может установить только один процесс. Попытки других процессов установить такую блокировку, пока она не снята процессом, установившем ее, оказываются неудачными. Эта неудача проявляется в том, что при использовании операции SETLK функция fcntl возвращает значение ‑1, а при использовании операции SETLKW в функции fcntl процесс приостанавливается до снятия блокировки другим процессом.

    Заметим, что блокировка посредством вызова функции fcntl действует только, если ее использование систематически применяется всеми программами, обращающимися к файлу. Если некоторая программа обращается к тому же файлу операциями read или write без предварительных операций fcntl в попытках установить блокировку, то, к сожалению, никаких блокировок, предохраняющих несогласованное использование файла, не реализуется.

    Следующая программа, приведенная листингом 2.4.1, демонстрирует использование функций открытия файла, закрытия файла, записи в файл, задание ограничения совместного доступа и аналогична по выполняемым действиям программе в листинге 2.3.1, написанной для другой ОС.

    int fhandle;int fhandle;

    fhandle=open(fname, O_WRONLY | O_CREAT | O_TRUNC, 0600);

    len=read(0, buffer+16, 80); // записываем вводимое после начального текста

    write(fhandle, buffer, 16+len);

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

    В этом примере значение поля l_type структуры данных lock типа flock задается равным константе F_WRLCK, т.е. указывается блокировка при записи данной программой, которая равносильна запрету как по чтению, так и по записи для других процессов. Начальный адрес участка задается на основе начальной позиции в файле (константа SEEK_SET в поле l_whence ) со смещением в l_start , равным нулю, т.е. указывается, что управляемый участок начинается с самого начала файла. Значение поля l_len задано нулевым, что равносильно указанию распространения действий до конца файла. Таким образом указано, что воздействию запрета на доступ для других процессов подлежит весь файл. Рассматриваемый запрет на запись осуществляется вызовом функции fcntl(fhandle, F_SETLKW, &lock) сразу после открытия файла. Если в последующие моменты времени до снятия этой блокировки другой процесс выполняет аналогичную функцию fcntl(fhandle, F_SETLKW, &lock), то он приостанавливается на этой функции до тех пор, пока блокировка не будет снята.

    После записи в файл функция write задает отмену запрета на запись, установленного данным процессом. С этой целью выполняется функция fcntl(fhandle, F_SETLK, &lock), в параметре lock которой задано поле l_type , равное константе F_UNLCK, т.е. указывается отмена блокировки (того же участка, что и раньше был указан в этой структуре).

    Заметим, что если не требуется принимать мер по управлению совместным использованием файла, то в программе для Unix достаточно просто не использовать функцию fcntl для этих целей. В частности, для упрощения рассматриваемого примера можно было отбросить из программы вызовы функции fcntl , описание и установки полей экземпляра lock структуры flock . В программах же для операционных систем MS Windows и OS/2 во всех случаях приходится использовать те же функции, что и в более сложном случае, причем с заданием всех их параметров.

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

    BOOL LockFile(HANDLE hFile,

    Данная функция при удачном выполнении блокирует доступ к указанному в ней участку для всех других процессов. Эта функция предназначена в общем случае для работы с очень большими файлами, размер которых превосходит числа, задаваемые в формате DWORD (более чем 32-битные двоичные числа, что соответствует границе в 4Гбайта). Поэтому для задания смещения блокируемого участка используются два аргумента FileOffsetLow и FileOffsetHigh , задающие младшую и старшую части такого смещения. Аналогичным образом для задания числа байтов в блокируемом участке предназначены два аргумента nNumberOfBytesToLockLow и nNumberOfBytesToLockHigh , также задающие младшую и старшую части этого числа.

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

    Обратной к функции LockFile является системная функция UnlockFile, которая имеет прототип

    BOOL UnlockFile(HANDLE hFile,

    DWORD FileOffsetLow, DWORD FileOffsetHigh,

    DWORD cbUnlockLow, DWORD cbUnlockHigh),

    где аргументы по своему назначению совпадают с уже рассмотренными в функции LockFile. Данная функция снимает блокировку с указанного в ней участка, давая тем самым свободный доступ к нему, если это, конечно, согласуется с общими режимами доступа для других процессов, определяемыми аргументом ShareMode в функции открытия файла CreateFile.

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

    BOOL LockFileEx(HANDLE hFile, DWORD Flags,

    BOOL UnlockFileEx(HANDLE hFile, DWORD dwReserved,

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

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

    В двух последних функциях значение смещения рассматриваемого участка файла размещается внутри структуры данных, задаваемых последним аргументом. Как видим, полноценное блокирование участков файлов в ОС типа Windows задается в действительности еще сложней чем в Unix.

    Как удалить заблокированный в системе Windows файл или папку? Начнем с того, что не каждый файл или папку нужно удалять: так, например, важные файлы самой Windows защищены от пользовательского вмешательства, и для их удаления потребуется запросить разрешение от TrustedInstaller – скрытой системной учетной записи, которая на голову выше любой учетной записи администратора. Если речь идет о редких случаях осознанного и контролируемого процесса удаления файлов или папок, которому препятствует системное уведомление «Запросите разрешение от TrustedInstaller», полный доступ с разрешением TrustedInstaller можно получить в свойствах удаляемой папки или файла.

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

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

    В безопасном режиме работы Windows;

    Загрузившись с Live-дисков или даже обычного установочного носителя Windows;

    В другой Windows или иной операционной системе, установленной на другом разделе или диске компьютера.

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

    1. Unlocker

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

    Работая с утилитой из контекстного меню, на заблокированном файле, соответственно, выбираем пункт «Unlocker».

    Инсталлятор Unlocker настроен на установку в систему вместе с «довесками», необходимо внимательно отслеживать шаги мастера установки, чтобы убрать галочки попутного внедрения ненужного софта.

    2. Lock Hunter

    Утилита Lock Hunter от Unlocker отличается возможностью работы не только с файлами, но и с заблокированными папками. Lock Hunter предусматривает кнопку обзора внутри своего интерфейса для добавления заблокированных папок или файлов, утилита также встраивается в контекстное меню проводника Windows в виде вопроса «Что блокирует этот файл (папку)».

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

    3. UnlockMe

    Утилита UnlockMe, как и предыдущие участники обзора, работает с заблокированными папками и файлами как внутри собственного интерфейса, предусматривая кнопки добавления данных,

    так и посредством опции в контекстном меню проводника Windows.

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

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

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

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

    Удаление заблокированных файлов программой Unlocker

    Скачав Unlocker, нам нужно установить его на компьютер. Для этого запускаем наш файл и после чего нажимаем несколько раз кнопку «Далее». Исключение является только шаг, где нам предлагают установить «Delta Toolbar ». По умолчанию отмечен пункт «Quick», что повлечет за собой установку toolbara и замену домашней страницы на «Delta». Но, так как нам это не нужно, отмечаем «Advanced » и убираем галочки которые находятся ниже, затем переходим к следующему этапу установки. После окончания копирования и установки файлов жмем «Готово».

    Теперь осталось ею только воспользоваться, находим файл который мы хотим удалить, и правым кликом вызываем меню, где и находим пункт «Unlocker»

    После нажатия появится окно с выбором действия. Если Вы хотите удалить файл, соответственно выбираем «Удалить » и нажимаем «ОК »

    Так же, с помощью этой программы можно переименовать заблокированный файл. Выбрав «Переименовать», появится дополнительное окошко где нужно указать имя документа и после нажатия «ОК», название документа или папки изменится.

    Теперь удаление заблокированных файлов или папок, с таким помощником как Unlocker, не составит для Вас труда. Так же, встречаются такие случаи, что некоторые скрывают свои вредоносные файлы и для их удаления нужно . Если вам помогла статья, не забудьте поставить лайк или ретвитнуть и подписаться на RSS.

    Работая с ОС Windows, часто приходится сталкиваться с тяжело удаляемыми файлами. Если файл используется каким-то приложением, либо самой системой, обычным способом удалить его не получится. На многократные и нервозные нажатия клавиши «Delete» в лучшем случае система монотонно будет отвечать одно и то же: «Файл используется, и удалить его невозможно», при худших раскладах — компьютер зависнет.

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

    Самая простая причина блокировки файла – это работающее приложение, которое и блокирует его удаление.

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

    Перезагрузка компьютера

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

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

    Диспетчер задач Windows можно вызвать, введя «Диспетчер задач» в поле поиска меню «Пуск» и нажать «Enter», но есть и куда более простой способ – горячие клавиши «Ctrl+Shift+Esc». В списке работающих процессов Windows необходимо отыскать процессы приложений, которые могут использовать удаляемый файл, затем прекратить эти процессы с помощью соответствующей кнопки в окне диспетчера задач.

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

    Специальные программы для разблокировки файлов

    Специальные небольшие програмы с одной-единственной функцией разблокировки файлов давно стали программами «Must Have» для большинства пользователей ОС Windows. Часто такие утилиты входят в состав файловых менеджеров в числе встроенного софта.

    Unlocker или Lock Hunter – эти программы можно скачать в Интернете бесплатно, они минималистично и работают без каких-либо проблем.

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

    Затем нужно определиться с командой – переименовать файл, переместить его, просто разблокировать или удалить. В процессе разблокировки Unlocker покажет, какими приложениями файл в данный момент используется.

    Lock Hunter также интегрируется с Windows и доступна в контекстном меню системы.

    Да и прочий функционал точно такой же – переименование, перемещение, информация о процессах, использующих файл, разблокировка и удаление.

    В отличие от Unlocker, программа Lock Hunter не русифицирована, но, учитывая минималистичность функционала, вряд ли использованию программы помешает языковой барьер, тем боле, что интерфейс интуитивно понятен.

    Редко, но все же, и программные разблокировщики типа Unlocker или Lock Hunter не справляются с проблемой, обещая удалить заблокированный файл при перезагрузке, но так и не выполняют обещание. Часто с такой ситуацией могут сталкиваться сотрудники корпорации, которые работают в рамках гостевых учетных записей Windows с ограниченными пользовательскими правами.

    Удалить заблокированный файл можно попробовать, загрузив Windows в безопасном режиме. Чтобы попасть в этот режим для Windows ХР и 7 во время загрузки (или перезагрузки), нужно жать клавишу F8 и в появившемся меню вариантов загрузки выбрать безопасный режим с загрузкой только основных драйверов и служб.

    С Windows 8/8.1 все обстоит несколько сложнее, придется проделать некоторые настройки (обо всех нюансах безопасного режима Windows 8.1 мы уже рассказывали в этой статье с видео). Один из вариантов: в меню «Пуск» или с помощью горячих клавиш «Win+ R» нужно вызвать команду «Выполнить», ввести в ее поле «msconfig» и нажать «Enter».

    Во вкладке «Загрузки» нужно отметить галочкой «Безопасный режим» и оставить по умолчанию опцию «Минимальная». Далее – кнопка «Применить».

    Во всплывшем окне предупреждения о необходимости перезагрузки системы для вступления в силу изменений нужно нажать кнопку «Перезагрузка».

    После перезагрузки система зайдет в безопасный режим. Удалив заблокированный файл, важно не забыть вернуть настройки Windows 8/8.1 во вкладке «Загрузки» в былое состояние, чтобы вновь перезагрузиться уже в обычном режиме работы системы.

    PHP — функции для работы с файлами и ввод-вывод

    Дата публикации: 2020-10-20

    От автора: в этой статье мы опишем следующие PHP функции работы с файлами: открытие файла, чтение файла, запись файла и закрытие файла.

    Открытие и закрытие файлов

    Для открытия файла используется функция PHP fopen(). Для нее требуется два аргумента, в которых сначала указывается имя файла, а затем режим работы. Режим можно указать как один из шести параметров в этой таблице.

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

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

    Как создать сайт самому?

    Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

    Чтение файла

    После того как файл был открыт с помощью функции fopen(), его можно считать с помощью функции fread(). Для этой функции требуется два аргумента. Это должны быть указатель файла и длина файла, выраженная в байтах. Длина файла может быть найдена с помощью функции filesize(), которая принимает имя файла в качестве аргумента и возвращает размер файла, выраженный в байтах. Итак, ниже приводятся этапы чтения файла PHP.

    Открытие файла, с помощью функции fopen()

    Получение длины файла, с помощь функции filesize()

    Считывание файла с помощью функции fread()

    Закрытие файл с помощью функции fclose()

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


    Способы организации файловых операций. Грамотная работа с файлами: исключительная блокировка файлов

    Оставьте комментарий 6,950

    Блокировки файлов

    Блокировки файлов и отдeльных записeй в файлах являются срeдством синхронизации мeжду работающими в коопeрации процeссами, пытающимися использовать один и тот жe файл одноврeмeнно.

    Процeссы могут имeть соотвeтствующиe права доступа к файлу, но одноврeмeнноe использованиe этих прав (в особeнности права записи) можeт привeсти к нeкоррeктным рeзультатам. Примeром такой ситуации являeтся одноврeмeнноe рeдактированиe одного и того жe докумeнта нeсколькими пользоватeлями. Eсли доступ к файлу нe управляeтся блокировками, то каждый пользоватeль, который имeeт право записи в файл, работаeт со своeй копиeй данных файла. Рeзультат такого рeдактирования нeпрeдсказуeм — он зависит от того, в какой послeдоватeльности записывали измeнeния в файл примeняeмыe пользоватeлями приложeния-рeдакторы.

    Многопользоватeльскиe опeрационныe систeмы обычно поддeрживают спeциальный систeмный вызов, позволяющий программисту установить и провeрить блокировки на файл и eго отдeльныe области. В UNIX такой систeмный вызов называeтся fcntl. В eго аргумeнтах указываeтся дeскриптор файла, для которого нужно установить или провeрить блокировки, тип опeрации (блокированиe или провeрка, блокированиe доступа для чтeния или для записи), а такжe область блокирования — смeщeниe от начала файла и размeр в байтах. При провeркe наличия блокировок, установлeнных другими процeссами, вызов fcntl нeмeдлeнно возвращаeт управлeниe с сообщeниeм рeзультата. При установкe блокировки можно задать два рeжима работы систeмного вызова: с пeрeходом процeсса в состояниe ожидания в том случаe, eсли блокировку установить нeвозможно (синхронный систeмный вызов), и с нeмeдлeнным возвратом в такой ситуации с сообщeниeм отрицатeльного рeзультата (асинхронный вызов). Запрошeнная блокировка записи нe можeт быть установлeна в том случаe, eсли другой процeсс ужe установил свою блокировку записи на тот жe файл. То eсть блокировка записи являeтся исключитeльной. Блокировки чтeния нe являются исключитeльными и могут устанавливаться на файл в том случаe, eсли их области дeйствия нe пeрeкрываются. Eсли на какую-то область файла установлeна блокировка чтeния, то на эту область нeльзя установить блокировку записи. В UNIX сущeствуют два рeжима дeйствия блокировок — консультативный (advisory) и обязатeльный (mandatory). Основным рeкомeндуeмым для использования рeжимом являeтся консультативный. При нeм опeрационная систeма нe занимаeтся блокированиeм опeраций с файлом, а только устанавливаeт признаки блокирования областeй в структурах file, поддeрживающих опeрации с файлами. Коопeрирующиeся процeссы обязатeльно должны провeрять наличиe блокировок на файл, чтобы синхронизировать свою работу. Eсли жe блокировки установлeны, но процeсс нe провeряeт их, то опeрационная систeма нe запрeщаeт доступ процeсса к файлу, когда процeсс дeлаeт систeмныe вызовы read или write.

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

    Непосредственное использование в Unix только функций открытия, закрытия, записи в файл и чтения из файла не обеспечивает полных возможностей совместного использования файлов. Для управления совместным доступом к открытым файлам Unix содержит дополнительные средства, обеспечиваемые через системную функцию fcntl. Функция эта имеет прототип

    int fcntl(int handle, int cmd, . . .).

    Параметр cmd задает операции, которые необходимо выполнить над файлом, указанным аргументом handle . Третий аргумент этой функции, который может быть указан после cmd , зависит от конкретного значения операции cmd . Имеется целый ряд возможных значений для аргумента операции функции fcntl, но большинство из них не будет рассматриваться здесь. Ограничимся только значениеми, относящимися к взаимной блокировке файлов и их записей. В этом случае функция fcntl приобретает вид

    int fcntl(int handle, int cmd, struct flock *ldata).

    Для этого варианта имеем три основных значения аргумента cmd . Они обозначаются символическими константами F_SETLK, F_SETLKW и F_GETLK. Структуры flock данных описываются в заголовочном файле в виде

    l _type; // тип блокировки

    short l _whence; // код базовой позиции для отсчета смещения

    off_t l _start; // смещение относительно базовой позиции

    off_t l _len; // сколько байтов находится в заблокированной области

    pid_t l _pid; // PID процесса, который блокировал файл

    Сами символические константы операций блокировок обозначают следующее. Константа F_SETLK задает попытку применить блокировку к файлу и немедленно возвратить управление либо же отменить блокировку, если это действие задано типом блокировки, равным F_UNLCK. При неудачной попытке наложения блокировки с операцией, заданной константой F_SETLK, функция fcntl возвращает код -1. Константа F_SETLKW приказывает попытаться применить блокировку к файлу и приостановить работу, если блокировка уже наложена другим процессом. Константа F_GETLK делает запрос на получение описания блокировки, отвечающей данным в аргументе ldata (возвращаемая информация описывает первую блокировку, препятствующую наложению блокировки, которая задается структурой ldata ).

    Код базовой позиции для отсчета смещения задает либо начальную позицию в файле (константой SEEK_SET), либо текущую позицию в нем (константой SEEK_CUR), либо позицию конца файла (константой SEEK_END).

    В пояснение описанных деталей отметим, что средства Unix позволяют управлять совместным доступом не только ко всему файлу, но и к отдельным участкам его. В частности, разрешить другим процессам только читать отдельные участки файла, а другим, может быть, разрешить изменять их. Поэтому указанные средства содержат не только указание разрешения вида доступа или соответственно запрета (блокировки) доступа, но и описание участка, к которому относится такой запрет. Именно с этой целью в состав структуры flock включены поля l_whence , l_start , l_len , причем поле l_len задает длину участка, на который распространяется действие конкретного вызова функции fcntl ; поле l_start задает начальное смещение рассматриваемого участка относительно точки позиции, указанной параметром l_ whence . Последний, в свою очередь, значениями констант задает отсчет позиции относительно начала файла, относительно текущего положения указателя позиции в нем или относительно конца файла. В качестве указанных констант могут быть взяты соответственно значения 0, 1, 2 или именованные константы SEEK_SET, SEEK_CUR, SEEK_END из заголовочного файла stdio.h. Поле l_len может быть задано числом 0, тогда блокировка распространяется от указанного в структуре начала файла до его конца (причем при дальнейшем увеличении файла в процессе работы с ним эта блокировка распространяется дальше – до текущего конца файла).

    В структуре данных flock тип блокировки, указываемый полем l_type , задается символическими константами, предварительно описанными в заголовочном файле. Эти константы следующие: F_RDLCK – установить на указанную в структуре область данных блокировку чтения; F_WRLCK – установить на указанную в структуре область данных блокировку записи; F_UNLCK – снять блокировку с указанной области. Функция fcntl может быть использована многократно для различных участков файла и для них с ее помощью могут быть установлены, изменены или сняты определенные виды блокировок.

    Блокировка по чтению (константой F_RDLCK) может быть установлена только в том случае, если файл, на который она устанавливается текущей программой, открыт для чтения (т.е. с режимом O_RDONLY или O_RDWR). Блокировка по записи (константой F_WRLCK) может быть установлена только, если файл, на который она устанавливается текущей программой, открыт данной программой для записи (т.е. с режимом O_WRONLY или O_RDWR).

    Блокировка чтения, задаваемая константой F_RDLCK, просто предотвращает установку другими процессами блокировки записи. Несколько процессов могут одновременно выполнять блокировку чтения для одного и того же участка файла. Блокировка по чтению может использоваться, чтобы предотвратить обновление данных, не скрывая их от просмотра другими процессами. Блокировка записи, задаваемая константой F_WRLCK, предотвращает установку другими процессами блокировок чтения и записи для файла. Для заданного участка файла может существовать только одна блокировка записи одновременно. Блокировка записи может использоваться для запрещения просмотра участков файла при выполнении обновлений.

    Блокировка по чтению на участок файла может устанавливаться независимо различными процессами, но блокировку по записи может установить только один процесс. Попытки других процессов установить такую блокировку, пока она не снята процессом, установившем ее, оказываются неудачными. Эта неудача проявляется в том, что при использовании операции SETLK функция fcntl возвращает значение ‑1, а при использовании операции SETLKW в функции fcntl процесс приостанавливается до снятия блокировки другим процессом.

    Заметим, что блокировка посредством вызова функции fcntl действует только, если ее использование систематически применяется всеми программами, обращающимися к файлу. Если некоторая программа обращается к тому же файлу операциями read или write без предварительных операций fcntl в попытках установить блокировку, то, к сожалению, никаких блокировок, предохраняющих несогласованное использование файла, не реализуется.

    Следующая программа, приведенная листингом 2.4.1, демонстрирует использование функций открытия файла, закрытия файла, записи в файл, задание ограничения совместного доступа и аналогична по выполняемым действиям программе в листинге 2.3.1, написанной для другой ОС.

    int fhandle;int fhandle;

    fhandle=open(fname, O_WRONLY | O_CREAT | O_TRUNC, 0600);

    len=read(0, buffer+16, 80); // записываем вводимое после начального текста

    write(fhandle, buffer, 16+len);

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

    В этом примере значение поля l_type структуры данных lock типа flock задается равным константе F_WRLCK, т.е. указывается блокировка при записи данной программой, которая равносильна запрету как по чтению, так и по записи для других процессов. Начальный адрес участка задается на основе начальной позиции в файле (константа SEEK_SET в поле l_whence ) со смещением в l_start , равным нулю, т.е. указывается, что управляемый участок начинается с самого начала файла. Значение поля l_len задано нулевым, что равносильно указанию распространения действий до конца файла. Таким образом указано, что воздействию запрета на доступ для других процессов подлежит весь файл. Рассматриваемый запрет на запись осуществляется вызовом функции fcntl(fhandle, F_SETLKW, &lock) сразу после открытия файла. Если в последующие моменты времени до снятия этой блокировки другой процесс выполняет аналогичную функцию fcntl(fhandle, F_SETLKW, &lock), то он приостанавливается на этой функции до тех пор, пока блокировка не будет снята.

    После записи в файл функция write задает отмену запрета на запись, установленного данным процессом. С этой целью выполняется функция fcntl(fhandle, F_SETLK, &lock), в параметре lock которой задано поле l_type , равное константе F_UNLCK, т.е. указывается отмена блокировки (того же участка, что и раньше был указан в этой структуре).

    Заметим, что если не требуется принимать мер по управлению совместным использованием файла, то в программе для Unix достаточно просто не использовать функцию fcntl для этих целей. В частности, для упрощения рассматриваемого примера можно было отбросить из программы вызовы функции fcntl , описание и установки полей экземпляра lock структуры flock . В программах же для операционных систем MS Windows и OS/2 во всех случаях приходится использовать те же функции, что и в более сложном случае, причем с заданием всех их параметров.

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

    BOOL LockFile(HANDLE hFile,

    Данная функция при удачном выполнении блокирует доступ к указанному в ней участку для всех других процессов. Эта функция предназначена в общем случае для работы с очень большими файлами, размер которых превосходит числа, задаваемые в формате DWORD (более чем 32-битные двоичные числа, что соответствует границе в 4Гбайта). Поэтому для задания смещения блокируемого участка используются два аргумента FileOffsetLow и FileOffsetHigh , задающие младшую и старшую части такого смещения. Аналогичным образом для задания числа байтов в блокируемом участке предназначены два аргумента nNumberOfBytesToLockLow и nNumberOfBytesToLockHigh , также задающие младшую и старшую части этого числа.

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

    Обратной к функции LockFile является системная функция UnlockFile, которая имеет прототип

    BOOL UnlockFile(HANDLE hFile,

    DWORD FileOffsetLow, DWORD FileOffsetHigh,

    DWORD cbUnlockLow, DWORD cbUnlockHigh),

    где аргументы по своему назначению совпадают с уже рассмотренными в функции LockFile. Данная функция снимает блокировку с указанного в ней участка, давая тем самым свободный доступ к нему, если это, конечно, согласуется с общими режимами доступа для других процессов, определяемыми аргументом ShareMode в функции открытия файла CreateFile.

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

    BOOL LockFileEx(HANDLE hFile, DWORD Flags,

    BOOL UnlockFileEx(HANDLE hFile, DWORD dwReserved,

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

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

    В двух последних функциях значение смещения рассматриваемого участка файла размещается внутри структуры данных, задаваемых последним аргументом. Как видим, полноценное блокирование участков файлов в ОС типа Windows задается в действительности еще сложней чем в Unix.

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

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

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

    Удаление заблокированных файлов программой Unlocker

    Скачав Unlocker, нам нужно установить его на компьютер. Для этого запускаем наш файл и после чего нажимаем несколько раз кнопку «Далее». Исключение является только шаг, где нам предлагают установить «Delta Toolbar ». По умолчанию отмечен пункт «Quick», что повлечет за собой установку toolbara и замену домашней страницы на «Delta». Но, так как нам это не нужно, отмечаем «Advanced » и убираем галочки которые находятся ниже, затем переходим к следующему этапу установки. После окончания копирования и установки файлов жмем «Готово».

    Теперь осталось ею только воспользоваться, находим файл который мы хотим удалить, и правым кликом вызываем меню, где и находим пункт «Unlocker»

    После нажатия появится окно с выбором действия. Если Вы хотите удалить файл, соответственно выбираем «Удалить » и нажимаем «ОК »

    Так же, с помощью этой программы можно переименовать заблокированный файл. Выбрав «Переименовать», появится дополнительное окошко где нужно указать имя документа и после нажатия «ОК», название документа или папки изменится.

    Теперь удаление заблокированных файлов или папок, с таким помощником как Unlocker, не составит для Вас труда. Так же, встречаются такие случаи, что некоторые скрывают свои вредоносные файлы и для их удаления нужно . Если вам помогла статья, не забудьте поставить лайк или ретвитнуть и подписаться на RSS.

    Как удалить заблокированный в системе Windows файл или папку? Начнем с того, что не каждый файл или папку нужно удалять: так, например, важные файлы самой Windows защищены от пользовательского вмешательства, и для их удаления потребуется запросить разрешение от TrustedInstaller – скрытой системной учетной записи, которая на голову выше любой учетной записи администратора. Если речь идет о редких случаях осознанного и контролируемого процесса удаления файлов или папок, которому препятствует системное уведомление «Запросите разрешение от TrustedInstaller», полный доступ с разрешением TrustedInstaller можно получить в свойствах удаляемой папки или файла.

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

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

    В безопасном режиме работы Windows;

    Загрузившись с Live-дисков или даже обычного установочного носителя Windows;

    В другой Windows или иной операционной системе, установленной на другом разделе или диске компьютера.

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

    1. Unlocker

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

    Работая с утилитой из контекстного меню, на заблокированном файле, соответственно, выбираем пункт «Unlocker».

    Инсталлятор Unlocker настроен на установку в систему вместе с «довесками», необходимо внимательно отслеживать шаги мастера установки, чтобы убрать галочки попутного внедрения ненужного софта.

    2. Lock Hunter

    Утилита Lock Hunter от Unlocker отличается возможностью работы не только с файлами, но и с заблокированными папками. Lock Hunter предусматривает кнопку обзора внутри своего интерфейса для добавления заблокированных папок или файлов, утилита также встраивается в контекстное меню проводника Windows в виде вопроса «Что блокирует этот файл (папку)».

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

    3. UnlockMe

    Утилита UnlockMe, как и предыдущие участники обзора, работает с заблокированными папками и файлами как внутри собственного интерфейса, предусматривая кнопки добавления данных,

    так и посредством опции в контекстном меню проводника Windows.

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

    Работая с ОС Windows, часто приходится сталкиваться с тяжело удаляемыми файлами. Если файл используется каким-то приложением, либо самой системой, обычным способом удалить его не получится. На многократные и нервозные нажатия клавиши «Delete» в лучшем случае система монотонно будет отвечать одно и то же: «Файл используется, и удалить его невозможно», при худших раскладах — компьютер зависнет.

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

    Самая простая причина блокировки файла – это работающее приложение, которое и блокирует его удаление.

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

    Перезагрузка компьютера

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

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

    Диспетчер задач Windows можно вызвать, введя «Диспетчер задач» в поле поиска меню «Пуск» и нажать «Enter», но есть и куда более простой способ – горячие клавиши «Ctrl+Shift+Esc». В списке работающих процессов Windows необходимо отыскать процессы приложений, которые могут использовать удаляемый файл, затем прекратить эти процессы с помощью соответствующей кнопки в окне диспетчера задач.

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

    Специальные программы для разблокировки файлов

    Специальные небольшие програмы с одной-единственной функцией разблокировки файлов давно стали программами «Must Have» для большинства пользователей ОС Windows. Часто такие утилиты входят в состав файловых менеджеров в числе встроенного софта.

    Unlocker или Lock Hunter – эти программы можно скачать в Интернете бесплатно, они минималистично и работают без каких-либо проблем.

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

    Затем нужно определиться с командой – переименовать файл, переместить его, просто разблокировать или удалить. В процессе разблокировки Unlocker покажет, какими приложениями файл в данный момент используется.

    Lock Hunter также интегрируется с Windows и доступна в контекстном меню системы.

    Да и прочий функционал точно такой же – переименование, перемещение, информация о процессах, использующих файл, разблокировка и удаление.

    В отличие от Unlocker, программа Lock Hunter не русифицирована, но, учитывая минималистичность функционала, вряд ли использованию программы помешает языковой барьер, тем боле, что интерфейс интуитивно понятен.

    Редко, но все же, и программные разблокировщики типа Unlocker или Lock Hunter не справляются с проблемой, обещая удалить заблокированный файл при перезагрузке, но так и не выполняют обещание. Часто с такой ситуацией могут сталкиваться сотрудники корпорации, которые работают в рамках гостевых учетных записей Windows с ограниченными пользовательскими правами.

    Удалить заблокированный файл можно попробовать, загрузив Windows в безопасном режиме. Чтобы попасть в этот режим для Windows ХР и 7 во время загрузки (или перезагрузки), нужно жать клавишу F8 и в появившемся меню вариантов загрузки выбрать безопасный режим с загрузкой только основных драйверов и служб.

    С Windows 8/8.1 все обстоит несколько сложнее, придется проделать некоторые настройки (обо всех нюансах безопасного режима Windows 8.1 мы уже рассказывали в этой статье с видео). Один из вариантов: в меню «Пуск» или с помощью горячих клавиш «Win+ R» нужно вызвать команду «Выполнить», ввести в ее поле «msconfig» и нажать «Enter».

    Во вкладке «Загрузки» нужно отметить галочкой «Безопасный режим» и оставить по умолчанию опцию «Минимальная». Далее – кнопка «Применить».

    Во всплывшем окне предупреждения о необходимости перезагрузки системы для вступления в силу изменений нужно нажать кнопку «Перезагрузка».

    После перезагрузки система зайдет в безопасный режим. Удалив заблокированный файл, важно не забыть вернуть настройки Windows 8/8.1 во вкладке «Загрузки» в былое состояние, чтобы вновь перезагрузиться уже в обычном режиме работы системы.

    Нужна ли блокировка файла при чтении/записи?

    Здравствуйте. При открытии файла для редактирования (fopen,fwrite, fclose), необходимо блокировать доступ к файлу (flock).

    Нужно ли блокировать доступ, если я использую функцию file_put_contents или даже copy() c заменой существующего?

    2 ответа 2

    @Deus, в Вашем случае (одновременная работа многих независимых запросов), конечно-же — ДА, нужно.

    Перед чтением — совместная блокировка (LOCK_SH), а перед записью — эксклюзивная (LOCK_EX).

    Кстати, обратите внимание, что flock() никак не влияет на возможность/невозможность выполнения fopen/fread/fwrite и т.п. Т.е. flock в одном процессе влияет на приостановку другого процесса именно на вызове flock в нем. (по крайней мере в *nix-ах).

    @avp, че-то я подумал, а вдруг в функцию file_put_content() внесена >автоматическая процедура блокировки. Ну, спасибо. Я думаю, информация пригодится.

    Автоматической блокировки нету. Как написано в документации:

    Функция идентична последовательным успешным вызовам функций fopen(), fwrite() и fclose().

    А по поводу как блокировать при использовании file_put_contents() тоже в доке написано, доступны флаги.

    пример из документации:

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

    Опять таки, доступен флаг:

    FILE_APPEND — Если файл filename уже существует, данные будут дописаны в конец файла вместо того, чтобы его перезаписать.

    flock

    (PHP 4, PHP 5, PHP 7)

    flock — Портируемая консультативная блокировка файлов

    Описание

    flock() позволяет осуществить простую модель чтения/записи, которая может быть использована практически на любой платформе (включая большинство вариантов Unix и даже Windows).

    В версиях PHP до 5.3.2 блокировка освобождалась также вызовом функции fclose() (которая также вызывается автоматически по завершении скрипта).

    PHP поддерживает портируемый способ консультативной блокировки (advisory locking) полностью всего файла (что означает, что все программы, осуществляющие доступ к файлу, должны использовать один и тот же способ блокировки, иначе блокировка не будет работать). По умолчанию данная функция будет ждать получения блокировки; это поведение можно изменить с помощью описанного ниже параметра LOCK_NB .

    Список параметров

    Указатель ( resource ) на файл, обычно создаваемый с помощью функции fopen() .

    operation может принимать следующие значения:

    • LOCK_SH для получения разделяемой блокировки (чтение).
    • LOCK_EX для получения эксклюзивной блокировки (запись).
    • LOCK_UN для снятия блокировки (разделяемой или эксклюзивной).

    Также возможно добавить константу LOCK_NB в качестве битовой маски к любой из вышеуказанных операций, если вы не хотите ждать, пока flock() получит блокировку.

    Необязательный третий параметр будет установлен в 1, если блокировка будет блокирующей (код ошибки EWOULDBLOCK).

    Возвращаемые значения

    Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

    Список изменений

    Версия Описание
    5.5.22, 5.6.6 Добавлена поддержка параметра wouldblock в Windows.
    5.3.2 Автоматическое снятие блокировки при закрытии было удалено. Снятие блокировки теперь всегда должно осуществляться вручную.

    Примеры

    Пример #1 Пример использования функции flock()

    = fopen ( «/tmp/lock.txt» , «r+» );

    if ( flock ( $fp , LOCK_EX )) < // выполняем эксклюзивную блокировку
    ftruncate ( $fp , 0 ); // очищаем файл
    fwrite ( $fp , «Что-нибудь пишем сюда\n» );
    fflush ( $fp ); // очищаем вывод перед отменой блокировки
    flock ( $fp , LOCK_UN ); // снимаем блокировку
    > else <
    echo «Не удалось получить блокировку!» ;
    >

    Пример #2 Использование flock() с параметром LOCK_NB

    = fopen ( ‘/tmp/lock.txt’ , ‘r+’ );

    /* Включаем параметр LOCK_NB в операции LOCK_EX */
    if(! flock ( $fp , LOCK_EX | LOCK_NB )) <
    echo ‘Не удалось получить блокировку’ ;
    exit(- 1 );
    >

    Примечания

    В Windows flock() использует обязательную (mandatory) блокировку вместо консультативной. Обязательная блокировка также поддерживается на Linux и операционных системах, основанных на System V с помощью стандартного механизма, который предоставляет системный вызов fcntl(): то есть искомый файл должен иметь установленный бит доступа setgid и неустановленный бит группового выполнения. Для корректной работы этой схемы в Linux, файловая система также должна быть смонтирована с опцией mand.

    Из-за того, что функции flock() необходим указатель на файл, вам может понадобиться воспользоваться специальным запирающим файлом для того, чтобы ограничить доступ к файлу, который вы намерены очищать, путём его открытия в режиме записи (используя «w» или «w+» в качестве аргумента функции fopen() ).

    Может быть использована только на дескрипторах локальных файлов, возвращенных функцией fopen() , или файловых дескрипторах пользовательских потоков, реализующих метод streamWrapper::stream_lock() .

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

    В некоторых операционных системах flock() реализован на уровне процессов. При использовании многопоточных серверных API, таких как ISAPI, вы не можете полагаться на flock() для защиты ваших файлов от других PHP-скриптов, которые работают в параллельном потоке на том же сервере!

    flock() не поддерживается на старых файловых системах вроде FAT и ее производных, так что всегда будет возвращать FALSE в этих окружениях.

    User Contributed Notes 38 notes

    The supplied documentation is vague, ambiguous and lacking, and the user comments contain erroneous information! The flock function follows the semantics of the Unix system call bearing the same name. Flock utilizes ADVISORY locking only; that is, other processes may ignore the lock completely; it only affects those that call the flock call.

    LOCK_SH means SHARED LOCK. Any number of processes MAY HAVE A SHARED LOCK simultaneously. It is commonly called a reader lock.

    LOCK_EX means EXCLUSIVE LOCK. Only a single process may possess an exclusive lock to a given file at a time.

    If the file has been LOCKED with LOCK_SH in another process, flock with LOCK_SH will SUCCEED. flock with LOCK_EX will BLOCK UNTIL ALL READER LOCKS HAVE BEEN RELEASED.

    If the file has been locked with LOCK_EX in another process, the CALL WILL BLOCK UNTIL ALL OTHER LOCKS have been released.

    If however, you call flock on a file on which you possess the lock, it will try to change it. So: flock(LOCK_EX) followed by flock(LOCK_SH) will get you a SHARED lock, not «read-write» lock.

    When a file is closed the lock will be released by the system anyway, even if PHP doesn’t do it explicitly anymore since 5.3.2 (the documentation is very confusing about this).

    However, I had a situation on an apache/PHP server where an out-of-memory error in PHP caused file handles to not be closed and therefore the locks where kept even thought PHP execution had ended and the process had returned to apache to serve other requests. The lock was kept alive until apache recycled those processes.

    This lack of proper clean up basically makes flock() completely unreliable.

    Indeed, flock() will not work reliably when the underlying filesystem is NFS. The proper way to perform file locking, in this case, would be to use PHP’s link() function. From the Linux man page of open():

    O_EXCL When used with O_CREAT, if the file already exists it is an
    error and the open will fail. In this context, a symbolic link
    exists, regardless of where its points to. O_EXCL is broken on
    NFS file systems, programs which rely on it for performing lock-
    ing tasks will contain a race condition. The solution for per-
    forming atomic file locking using a lockfile is to create a
    unique file on the same fs (e.g., incorporating hostname and
    pid), use link(2) to make a link to the lockfile. If link()
    returns 0, the lock is successful. Otherwise, use stat(2) on
    the unique file to check if its link count has increased to 2,
    in which case the lock is also successful.

    Like a user already noted, most Linux kernels (at least the Redhat ones) will return false, even if you locked the file. This is because the lock is only ADVISORY (you can check that in /proc/locks). What you have to do there is to evalute the 3rd parameter of flock(), $eWouldBlock. See for an example below. Note however that if you
    lock the file in non blocking mode, flock() will work as expected (and blocks the script).

    = fopen ( «/var/lock/process.pid» , «a» );
    if ( ! $fp || ! flock ( $fp , LOCK_EX | LOCK_NB , $eWouldBlock ) || $eWouldBlock ) <
    fputs ( STDERR , «Failed to acquire lock!\n» );
    exit;
    >

    // do your work here

    fclose ( $fp );
    unlink ( «/var/lock/process.pid» );

    Regarding the change in PHP 5.3.2 with locked files:

    Without having studied the PHP source code in detail, the situation appears to be as follows when the PHP function fclose() is called:

    Before 5.3.2 PHP would check if the file was locked, then release the lock, and then close the file.

    From 5.3.2 PHP just closes the file.

    But note, that the operating system releases the lock automatically when the file is closed. Therefore a call to fclose() STILL releases the lock (this is tested with PHP 5.3.2, Linux, x64).

    Simple Helper for lock files creation

    class FileLocker <
    protected static $loc_files = array();

    public static function lockFile ( $file_name , $wait = false ) <
    $loc_file = fopen ( $file_name , ‘c’ );
    if ( ! $loc_file ) <
    throw new \ Exception ( ‘Can\’t create lock file!’ );
    >
    if ( $wait ) <
    $lock = flock ( $loc_file , LOCK_EX );
    > else <
    $lock = flock ( $loc_file , LOCK_EX | LOCK_NB );
    >
    if ( $lock ) <
    self :: $loc_files [ $file_name ] = $loc_file ;
    fprintf ( $loc_file , «%s\n» , getmypid ());
    return $loc_file ;
    > else if ( $wait ) <
    throw new \ Exception ( ‘Can\’t lock file!’ );
    > else <
    return false ;
    >
    >

    public static function unlockFile ( $file_name ) <
    fclose ( self :: $loc_files [ $file_name ]);
    @ unlink ( $file_name );
    unset( self :: $loc_files [ $file_name ]);
    >

    if ( ! FileLocker :: lockFile ( ‘/tmp/1.lock’ ) ) <
    echo «Can’t lock file\n» ;
    die();
    >
    sleep ( 10 );
    FileLocker :: unlockFile ( ‘/tmp/1.lock’ );
    echo «All Ok\n» ;

    I just spent some time (again) to understand why a reading with file_get_contents() and file was returning me an empty string «» or array() whereas the file was existing and the contents not empty.

    In fact, i was locking file when writing it (file_put_contents third arg) but not testing if file was locked when reading it (and the file was accessed a lot).

    So, please pay attention that file_get_contents(), file() and maybe others php files functions are going to return empty data like if the contents of the file was an empty string.

    To avoid this problem, you have to set a LOCK_SH on your file before reading it (and then waiting if locked).

    Something like this :

    public static function getContents ( $path , $waitIfLocked = true ) <
    if(! file_exists ( $path )) <
    throw new Exception ( ‘File «‘ . $path . ‘» does not exists’ );
    >
    else <
    $fo = fopen ( $path , ‘r’ );
    $locked = flock ( $fo , LOCK_SH , $waitIfLocked );

    if(! $locked ) <
    return false ;
    >
    else <
    $cts = file_get_contents ( $path );

    flock ( $fo , LOCK_UN );
    fclose ( $fo );

    return $cts ;
    >
    >
    >
    ?>

    Code to test by yourself :

    file.php :
    = fopen ( ‘abc.txt’ , ‘r+’ );

    flock ( $fo , LOCK_EX );
    sleep ( 10 );
    flock ( $fo , LOCK_UN );
    ?>

    file2.php :
    ( file_get_contents ( ‘abc.txt’ ));
    var_dump ( file ( ‘abc.txt’ ));
    ?>

    Then launch file.php and switch to file2.php during the 10 seconds and see the difference before/after

    I just want to add a note about making atomic lock on NFS, there is only two
    ways:

    — 1 (the most robust but the most complicate) — It’s to use link() to create a
    hard link to a file you want to lock (on the same FS of course).
    (On most NFS implementations, Link() is atomic)

    Once you created a hard link (not a symbolic link), with a unique randomly
    generated name, call stat() on it and count the number of link (nlink), if there
    is only 2 then the file is locked.

    If there is more than two you have to unlink() the link you just created and
    create a new one with a new unique name (else NFS will use its cache and stat
    will return wrong data) then call stat() on the new link and test the number of
    links again, repeat this operation until you get the lock.

    You have to use usleep() between the link() attempts with a fixed + random
    sleep value to avoid dead lock situations (link() and unlink() may be atomic
    but not instantaneous)

    Also note than when you unlink a file through NFS, if NFS think that the file
    is still in use, it will create a .nfs link to this file until it realizes the
    file is no longer in use. A wrong timing could generate thousands of those
    files and a deadlock situation. Because of this when a deadlock situation
    occurs or if your stat() command returns a very high number of links, you have
    to look for .nfs file in the same directory you created your links and unlink
    all the .nfs file you find (sometimes NFS take its time to remove them)

    — 2 (the simplest) — the second method is to use a lock server and lock daemons
    on each client that will forward lock request to the server. (this is more
    dangerous than the first method because the daemons may be killed. )

    Here is for reference the function I created to make atomic locks through NFS
    (this function is in production since at least 4 years now), it’s just for
    reference because it uses many external functions to do its job but you can see
    the principle:

    besides from what the manual says about locking a file opendend in w or w+ and using a special lock file for these cases, you should simply truncate the file yourself with ftruncate() after writing:

    = ‘some data’ ;
    $handle = fopen ( ‘file’ , ‘r+’ );
    flock ( $handle , LOCK_EX );
    fwrite ( $handle , $data );
    ftruncate ( $handle , ftell ( $handle ));
    flock ( $handle , LOCK_UN );
    fclose ( $handle );

    ?>

    now the file will have the size of $data without opening the file in w mode but with a lock on the file.

    to the previous writers jpriebe and mallory:
    of course the lock is lost in this case, but thats simply because the file is closed by PHP. and closing the file means unlocking it (same as when you use fclose() yourself).

    I have found that if you open a currently locked file with ‘w’ or ‘w+’ («file pointer at the beginning of the file and truncate the file to zero length») then it will not truncate the file when the lock is released and the file available.

    Example I used to test it:
    // a.php
    $fp = fopen ( «/tmp/lock.txt» , «w+» );
    flock ( $fp , LOCK_EX ); // exclusive lock

    $steps = 10 ;
    // write to the file
    for ( $i = 0 ; $i $steps ; $i ++) <
    fwrite ( $fp , ‘a ‘ . time (). ‘ test ‘ . $i . «\n» );
    sleep ( 1 );
    >
    flock ( $fp , LOCK_UN ); // release the lock
    fclose ( $fp );
    ?>

    ———-
    // b.php

    $fp = fopen ( «/tmp/lock.txt» , «w+» );
    flock ( $fp , LOCK_EX ); // exclusive lock

    // ftruncate($fp, 0) is needed here! $steps = 5 ;
    // write to the file
    for ( $i = 0 ; $i $steps ; $i ++) <
    fwrite ( $fp , ‘b ‘ . time (). ‘ test ‘ . $i . «\n» );
    sleep ( 1 );
    >
    flock ( $fp , LOCK_UN ); // release the lock
    fclose ( $fp );
    ?>

    Loading a.php then loading b.php right after will result in:
    b 1054075769 test 0
    b 1054075770 test 1
    b 1054075771 test 2
    b 1054075772 test 3
    b 1054075773 test 4
    a 1054075764 test 5
    a 1054075765 test 6
    a 1054075766 test 7
    a 1054075767 test 8
    a 1054075768 test 9

    As you can see, b.php does not truncate the file as the w+ would suggest if the file were instantly available. But only moves the pointer to the begining of the file. If b.php was loaded after a.php finished then there would be no «a . » lines in the file, since it would be truncated.

    To fix this you have to add ftruncate($fp, 0) right after the flock.

    ‘r+’ and ‘a’ seem to work fine, though.

    I ran into a loop because I just checked for true (= you got the lock) as return value of flock() and tried again when I got a false.

    function naive_wait_for_file ( $fp ) <
    while ( true ) <
    if ( flock ( $fp , LOCK_EX )) <
    return;
    >
    $k = rand ( 0 , 20 );
    usleep ( round ( $k * 10000 )); # k * 10ms
    >
    >
    ?>

    Unfortunately in one case the $fp I put in was invalid, so I always got false and got stuck.
    Lesson: check if your $fp is valid before entering the loop, or look closer if you get a false.

    function wait_for_file ( $fp ) <
    if ( $fp === false ) <
    return;
    >
    while ( true ) <
    if ( flock ( $fp , LOCK_EX )) <
    return;
    >
    $k = rand ( 0 , 20 );
    usleep ( round ( $k * 10000 )); # k * 10ms
    >
    >
    ?>

    just wanted to say that you will most likely fail if you use a separate lock file together with register_shutdown_function.

    my script did some different actions. resizing pictures, rotating them and this stuff. it needed a «database» file to get the correct file locations. this database file also stored some flags. and of course the script had to save that file when it was done.

    because of my script exited on many different points depending on the action i used register_shutdown_function to save the file. it wanted to use a locking system to be sure the script doesn’t overwrite the data another process had written into it some microseconds before. i was running on windows 2000 and apache2 on my developing machine, and flock always returned true for some reason. so i used a separate lock file. the script looked for it at the beginning and exited if it was found. otherwise it created it. but this file had to be deleted at the end. i put the unlink command into the registered shutdown-function but it never deleted the file. i tried clearstatcache and some other stuff but it didn’t help.

    maybe this helps someone.

    And here’s the timeout template for UNIX:

    ( SIGALRM , function() <>);
    pcntl_alarm ( 3 );
    try <
    if (! flock ( $handle , LOCK_EX )) <
    throw new \ Exception ( «Timeout» );
    >
    > finally <
    pcntl_alarm ( 0 );
    pcntl_signal_dispatch ();
    pcntl_signal ( SIGALRM , SIG_DFL );
    >
    ?>

    Actually, there is no use of the while loop with the usleep. My testing has revealed the following:

    //some code here
    flock ( $file_handle , LOCK_EX ) // ?>

    This will actually check for the lock without pausing and then it will sleep:

    //code here
    while (! flock ( $file_handle , LOCK_EX | LOCK_NB )) <
    //Lock not acquired, try again in:
    usleep ( round ( rand ( 0 , 100 )* 1000 )) //0-100 miliseconds
    >
    //lock acquired
    //rest of the code
    ?>

    The problem is, if you have a busy site and a lots of locking, the while loop may not acquire the lock for some time. Locking without LOCK_NB is much more persistent and it will wait for the lock for as long as it takes. It is almose guaranteed that the file will be locked, unless the script times out or something.

    Consider these two scripts: 1st one is ran, and the second one is ran 5 seconds after the first.

    //1st script
    $file_handle = fopen ( ‘file.test’ , ‘r+’ );
    flock ( $file_handle , LOCK_EX ); //lock the file
    sleep ( 10 ); //sleep 10 seconds
    fclose ( $file_handle ); //close and unlock the file
    ?>

    //2nd script
    $file_handle = fopen ( ‘file.test’ , ‘r+’ );
    flock ( $file_handle , LOCK_EX ); //lock the file
    fclose ( $file_handle ); //close and unlock the file
    ?>

    If you run 1st and then the 2nd script,the 2nd script will wait untill the 1st has finished. As soon as the first script finishes, the second one will acquire the lock and finish the execution. If you use flock($file_handle, LOCK_EX | LOCK_NB) in the 2nd script while the 1st script is running, it would finish execution immediately and you would not get the lock.

    When writing to a file, you should avoid using w+ because it would erase the contents of the file before locking

    If you need to write the complete file again you could use the following instead:

    = fopen ( ‘yourfile.txt’ , ‘a’ ) ;

    if ( flock ( $fp , LOCK_EX )) <
    ftruncate ( $fp , 0 ) ; // fputs ( $fp , ‘test string’ ) ;

    flock ( $fp , LOCK_UN ) ;
    >

    fclose ( $fp ) ;
    ?>

    Best,
    Fernando Gabrieli

    you can wrap a lock as an object to make it a scope-based lock. when the lock object is no longer referenced, like when it’s unset or the owner returns, the destructor will call unlock.

    this way you can just create a lock object and forget about it.

    public static function read ( $handle ) <
    $lock = new static();
    $lock -> handle = $handle ;
    return flock ( $handle , LOCK_SH ) ? $lock : false ;
    >

    public static function write ( $handle ) <
    $lock = new static();
    $lock -> handle = $handle ;
    return flock ( $handle , LOCK_EX ) ? $lock : false ;
    >

    public function __destruct ( ) <
    flock ( $this -> handle , LOCK_UN );
    >

    Here’s a handy class to allow retrying a write with flock a set number of times. If it can’t flock, it will sleep for a brief random interval and try again. If you have a lot of concurrent writes going on, you can use it to avoid data corruption.

    class SafeWriter
    <
    // suggested mode ‘a’ for writing to the end of the file
    public static function writeData ( $path , $mode , $data )
    <
    $fp = fopen ( $path , $mode );
    $retries = 0 ;
    $max_retries = 100 ;

    if (! $fp ) <
    // failure
    return false ;
    >

    // keep trying to get a lock as long as possible
    do <
    if ( $retries > 0 ) <
    usleep ( rand ( 1 , 10000 ));
    >
    $retries += 1 ;
    > while (! flock ( $fp , LOCK_EX ) and $retries $max_retries );

    // couldn’t get the lock, give up
    if ( $retries == $max_retries ) <
    // failure
    return false ;
    >

    // got the lock, write the data
    fwrite ( $fp , » $data \n» );
    // release the lock
    flock ( $fp , LOCK_UN );
    fclose ( $fp );
    // success
    return true ;
    >
    >
    ?>

    LOCK_NB seems to be checked and works fine in Windows, too, in PHP 5.3.3.

    For instance, try concurrently running two instances of the following script (via the CLI). The second prints «Didn’t quite get the lock. » as expected, whereas w/o the LOCK_NB flag, it just hangs.

    = fopen ( «flocktest.txt» , «w» );
    if ( flock ( $x , LOCK_EX | LOCK_NB )) <
    print «No problems, I got the lock, now I’m going to sit on it.» ;
    while ( true )
    sleep ( 5 );
    > else <
    print «Didn’t quite get the lock. Quitting now. Good night.» ;
    >
    fclose ( $x );
    ?>

    I’m thinking that a good way to ensure that no data is lost would be to create a buffer directory that could store the instructions for what is to be written to a file, then whenever the file is decidedly unlocked, a single execution could loop through every file in that directory and apply the indicated changes to the file.

    I’m working on writing this for a flat-file based database. The way it works is, whenever a command is issued (addline, removeline, editline), the command is stored in a flat file stored in a folder named a shortened version of the filename to be edited and named by the time and a random number. In that file is a standardized set of commands that define what is to be done to what file (the likes of «file: SecuraLog/index_uid» new line «editline: 14»).

    Each execution will check every folder in that directory for files and a certain amount of time (I don’t know how long, maybe 1-2 seconds) is spent making pending changes to unlocked files. This way no changes will be lost (i.e. person 1 makes a change at the same time as person 2, and person 1 loses the race by just enough to have their changed version of the file overwritten by person 2’s version) and there will be no problems with opening an empty open file.

    If you are interested in using file locking as indicator that your console app is running and you don’t want to start it again:

    if (!flock($fp, LOCK_EX | LOCK_NB, $wouldblock)) <
    if ($wouldblock) <
    //Another process holds the lock!

    > else <
    //Couldn’t lock for another reason, e.g. no such file

    startJob();
    >
    Please note that this is platform independent solution, but you have restrictions in PHP version (5.5.22 on Windows).
    Also, some old file systems are not supported.

    Notice: On NFS with NFS locking daemon you cannot open file for reading and than lock exklusively:

    $rFopened = fopen($sFile,’r’);
    $bResult = flock($rFopened, LOCK_EX);

    var_dump($bResult); // returns FALSE

    Mixed fopen modes (a+, w+ . ) works with LOCK_EX fine.

    I use exclusive writing to replace standard flock():

    // get/set lock file name
    function m_lock_file ( $format = null ) <
    static $file_format = ‘./%s.lock’ ;

    if ( $format !== null ) <
    $file_format = $format ;
    >

    // acquire/check/release lock
    function m_lock ( $lockId , $acquire = null ) <
    static $handlers = array();

    if ( is_bool ( $acquire )) <
    $file = sprintf ( m_lock_file (), md5 ( $lockId ), $lockId );
    >

    if ( $acquire === false ) <
    if (isset( $handlers [ $lockId ])) <
    @ fclose ( $handlers [ $lockId ]);
    @ unlink ( $file );
    unset( $handlers [ $lockId ]);
    > else <
    trigger_error ( «Lock ‘ $lockId ‘ is already unlocked» , E_USER_WARNING );
    >
    >

    if ( $acquire === true ) <
    if (!isset( $handlers [ $lockId ])) <
    $handler = false ;
    $count = 100 ;
    do <
    if (! file_exists ( $file ) || @ unlink ( $file )) <
    $handler = @ fopen ( $file , «x» );
    >
    if ( false === $handler ) <
    usleep ( 10000 );
    > else <
    $handlers [ $lockId ] = $handler ;
    >
    > while ( false === $handler && $count — > 0 );
    > else <
    trigger_error ( «Lock ‘ $lockId ‘ is already locked» , E_USER_WARNING );
    >
    >

    return isset( $handlers [ $lockId ]);
    >
    ?>

    Usage sample:

    m_lock ( $lockId , true );
    if ( m_lock ( $lockId )) <
    echo «locked» ;

    // here you can perform any thread-safe operations
    usleep ( 300 * 1000 );

    m_lock ( $lockId , false );
    > else <
    echo «not locked» ;
    >

    I have noticed that if you change the value of your fopen ressource, the lock is working no longer..

    = fopen ( ‘lockfile.txt’ , ‘a’ );

    flock ( $fo , LOCK_EX );


    // Lock is disable

    Just a comment about the last method to lock files using filemtime().
    What if filemtime($fp[1]) == $fp[3] because somebody modified the file less than 1s after the value of $fp[3] was picked up?
    Then this modification will be lost.

    This system to lock files is made to prevent problems when two modifications are so close that they can interfere, so the case «less than 1s» will often happen?

    However, lose some modifications is better than spoil all the file.

    «Assigning another value to handle argument in subsequent code will release the lock.»
    Note: this is also true for losing the handle’s context completely (like returning from a function, in which the handle was a local variable).

    function mylock () <
    $F1 = fopen ( «testfile» , «r» );
    if ( flock ( $F1 , LOCK_EX | LOCK_NB )) echo «First lock OK\n» ; else echo «First lock FAIL\n» ;
    $F2 = fopen ( «testfile» , «r» );
    if ( flock ( $F2 , LOCK_EX | LOCK_NB )) echo «Second lock OK\n» ; else echo «Second lock FAIL\n» ;
    >

    mylock ();
    echo «Function returned.\n» ;
    mylock ();

    unlink ( «testfile» );
    ?>

    Prints out:

    First lock OK
    Second lock FAIL
    Function returned.
    First lock OK
    Second lock FAIL

    This will lock the testfile, then attempt to lock it again with a new file handle (obviously failing). Trying this again, though, results in proper locking again (and then failing again), because when exiting the function both handles are lost and automatically unlocked.

    if you are used to reply with qualified error messages by using «track_errors = 1» and $php_errormsg, flock() will nark you, if you use LOCK_NB .

    If flock() fails due to LOCK_NB $php_errormsg will not be created and filled with an error message like ‘could not lock file, file already locked’.

    You can use some little workaround which does also on WIN:

    function some_file_operations($filename)
    <
    GLOBAL $MYERRORMSG;

    if (! @flock($fh, LOCK_SH | LOCK_NB, $wb))
    <
    if (!isset($php_errormsg)) $php_errormsg = ‘could not lock file, file already locked’;
    $MYERRORMSG = $php_errormsg;
    return false;
    >
    >
    #———————————

    In case of fail $MYERRORMSG now will hold a qualified error message

    flock on Solaris is slightly strange: it will fail if you try to get an exclusive lock on a file not opened for writing. That is, for reading files, you MUST use a shared lock. From the Solaris man page for flock:

    «Read permission is required on a file to obtain a shared lock, and write permission is required to obtain an exclusive lock.»

    In contrast, this is from the Linux man page for flock:

    «The mode used to open the file doesn’t matter to flock.»

    I’ve been testing a few custom file access functions but I always liked the simplicity of file_get_contents(). Of course it doesn’t seem to respect any file locks created with flock(). I created the function below to wrap around file_get_contents() so it can support locked files. It’s an odd way of doing it but it works for me.

    function flock_get_contents ( $filename )<

    Because:
    1) flock() is not safe if multiple php sessions are simultaneously locking.
    2) fopen( , ‘a’) is not safe if multiple php sessions are simultaneously appending.
    3) usleep and sleep are known for having problems.

    I wrote the Weblog function, it’s purpose is to append a line to logging. This function handles the concurrency as follows:
    — Try to create a lockfile named: $directory . date(‘Ymd’) . $logfile . 1 . lock
    — If this fails, try to create lockfile named: $directory . date(‘Ymd’) . $logfile . 2 . lock
    — etc. After 100 tries return false.

    — When the lockfile is acquired the file named: $directory.date(‘Ymd’).$logfile.1 (or .2 or .3 or .25) is opened or created.
    — If created the a «extended log file» header is written.
    — Write out the line.
    — Close the flie and if created set the correct access rights. (I had some problems creating files on a webserver, I did not see them when I opened a FTP session to the webdirectory. The chmod did the trick for me).

    — Remove the lockfile.

    There is only one drawback, multiple logfiles are created.
    e.g. (executed on 15 september 2010)
    Weblog(‘./’ , ‘visit’, ‘Somebody requested the index page’);
    Could lead to 100 files, depending how many concurrent php sessions are simultaneously trying to append a logline:
    ./20100915visit.1
    ./20100915visit.2
    ./20100915visit.3
    ./20100915visit.4
    .
    ./20100915visit.100

    This function is donated to the public domain. Maybe you can give me some credit by leaving in the author comment, but it is not required. You may modify this as you wish.
    (This function was inspired by the function m_lock_file presented by Kuzma dot Deretuke at gmail dot com)

    function Weblog ( $directory , $logfile , $message )
    <
    // Created 15 september 2010: Mirco Babin
    $curtime = time ();
    $logfile = date ( ‘Ymd’ , $curtime ) . $logfile ;

    if (!isset( $directory ) || $directory === false )
    $directory = ‘./’ ;
    if ( substr ( $directory ,- 1 ) !== ‘/’ )
    $directory = $directory . ‘/’ ;

    $count = 1 ;
    while( 1 )
    <
    $logfilename = $directory . $logfile . ‘.’ . $count ;

    $lockfile = $logfilename . ‘.lock’ ;
    $lockhandle = false ;
    if (! file_exists ( $lockfile ) || @ unlink ( $lockfile ))
    $lockhandle = @ fopen ( $lockfile , ‘xb’ );
    if ( $lockhandle !== false ) break;

    $count ++;
    if ( $count > 100 ) return false ;
    >

    if ( file_exists ( $logfilename ))
    <
    $created = false ;
    $loghandle = @ fopen ( $logfilename , ‘ab’ );
    >
    else
    <
    $loghandle = @ fopen ( $logfilename , ‘xb’ );
    if ( $loghandle !== false )
    <
    $created = true ;

    $str = ‘#version: 1.0’ . «\r\n» .
    ‘#Fields: date time c-ip x-msg’ . «\r\n» ;
    fwrite ( $loghandle , $str );
    >
    >

    if ( $loghandle !== false )
    <
    $str = date ( ‘Y-m-d’ , $curtime ) . «\t» .
    date ( ‘H:i:s’ , $curtime ) . «\t» .
    (isset( $_SERVER [ ‘REMOTE_ADDR’ ]) ? $_SERVER [ ‘REMOTE_ADDR’ ] : ‘-‘ ) . «\t» .
    ‘»‘ . str_replace ( ‘»‘ , ‘»»‘ , $message ) . ‘»‘ . «\r\n» ;
    fwrite ( $loghandle , $str );

    if ( $created ) chmod ( $logfilename , 0644 ); // Read and write for owner, read for everybody else

    $result = true ;
    >
    else
    <
    $result = false ;
    >

    fclose ( $lockhandle );
    @ unlink ( $lockfile );

    Грамотная работа с файлами: исключительная блокировка файлов. Удаляем заблокированные файлы

    Excel для Office 365 Word для Office 365 PowerPoint для Office 365 Excel 2020 Word 2020 PowerPoint 2020 Excel 2020 Word 2020 PowerPoint 2020 Excel 2013 Word 2013 PowerPoint 2013 Excel 2010 Word 2010 PowerPoint 2010 Office 2010 Меньше

    Файлы, созданные в предыдущих версиях Office (например, документы Word 95), по умолчанию открываются в режиме защищенного просмотра с отключенными возможностями редактирования.

    Функция блокировки файлов запрещает открывать файлы устаревших типов и приводит к их открытию в режиме защищенного просмотра (при этом команды «Сохранить» и «Открыть» отключены). В коде, который открывает и сохраняет файлы в устаревших форматах, есть уязвимости, которые могут быть использованы злоумышленниками. Таким образом, они представляют собой угрозу безопасности, которой следует по возможности избегать.

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

    Ниже приведены примеры панели сообщений для блокировки файлов. Желтый значок щита указывает на то, что файл можно редактировать, а красный — на то, что это запрещено.

    Редактирование заблокированного файла

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

    На вкладке Файл выберите пункт Параметры .

    Выберите пункт , нажмите кнопку и выберите пункт Параметры блокировки файлов .

    Просмотр и изменение параметров блокировки файлов в центре управления безопасностью

    Откройте приложение Office.

    На вкладке Файл выберите пункт Параметры .

    Выберите пункт Центр управления безопасностью , нажмите кнопку Параметры центра управления безопасностью. и выберите пункт Параметры блокировки файлов .

    В списке Тип файла установите и снимите флажки Открыть и Сохранить для типов файлов, которые нужно заблокировать или разрешить.

    Примечание: Флажок Открыть невозможно установить, если не установлен флажок Сохранить .

    Описание параметров блокировки файлов

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

    Открывать выбранные типы файлов в режиме защищенного просмотра. Файлы выбранных типов открываются в режиме защищенного просмотра. Кнопка Разрешить редактирование отключена на панели сообщений и в представлении Backstage.

    Открывать выбранные типы файлов в режиме защищенного просмотра и разрешать редактирование . Файлы выбранных типов открываются в режиме защищенного просмотра. Кнопка Разрешить редактирование включена на панели сообщений и в представлении Backstage.

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

    Непосредственное использование в Unix только функций открытия, закрытия, записи в файл и чтения из файла не обеспечивает полных возможностей совместного использования файлов. Для управления совместным доступом к открытым файлам Unix содержит дополнительные средства, обеспечиваемые через системную функцию fcntl. Функция эта имеет прототип

    int fcntl(int handle, int cmd, . . .).

    Параметр cmd задает операции, которые необходимо выполнить над файлом, указанным аргументом handle . Третий аргумент этой функции, который может быть указан после cmd , зависит от конкретного значения операции cmd . Имеется целый ряд возможных значений для аргумента операции функции fcntl, но большинство из них не будет рассматриваться здесь. Ограничимся только значениеми, относящимися к взаимной блокировке файлов и их записей. В этом случае функция fcntl приобретает вид

    int fcntl(int handle, int cmd, struct flock *ldata).

    Для этого варианта имеем три основных значения аргумента cmd . Они обозначаются символическими константами F_SETLK, F_SETLKW и F_GETLK. Структуры flock данных описываются в заголовочном файле в виде

    l _type; // тип блокировки

    short l _whence; // код базовой позиции для отсчета смещения

    off_t l _start; // смещение относительно базовой позиции

    off_t l _len; // сколько байтов находится в заблокированной области

    pid_t l _pid; // PID процесса, который блокировал файл

    Сами символические константы операций блокировок обозначают следующее. Константа F_SETLK задает попытку применить блокировку к файлу и немедленно возвратить управление либо же отменить блокировку, если это действие задано типом блокировки, равным F_UNLCK. При неудачной попытке наложения блокировки с операцией, заданной константой F_SETLK, функция fcntl возвращает код -1. Константа F_SETLKW приказывает попытаться применить блокировку к файлу и приостановить работу, если блокировка уже наложена другим процессом. Константа F_GETLK делает запрос на получение описания блокировки, отвечающей данным в аргументе ldata (возвращаемая информация описывает первую блокировку, препятствующую наложению блокировки, которая задается структурой ldata ).

    Код базовой позиции для отсчета смещения задает либо начальную позицию в файле (константой SEEK_SET), либо текущую позицию в нем (константой SEEK_CUR), либо позицию конца файла (константой SEEK_END).

    В пояснение описанных деталей отметим, что средства Unix позволяют управлять совместным доступом не только ко всему файлу, но и к отдельным участкам его. В частности, разрешить другим процессам только читать отдельные участки файла, а другим, может быть, разрешить изменять их. Поэтому указанные средства содержат не только указание разрешения вида доступа или соответственно запрета (блокировки) доступа, но и описание участка, к которому относится такой запрет. Именно с этой целью в состав структуры flock включены поля l_whence , l_start , l_len , причем поле l_len задает длину участка, на который распространяется действие конкретного вызова функции fcntl ; поле l_start задает начальное смещение рассматриваемого участка относительно точки позиции, указанной параметром l_ whence . Последний, в свою очередь, значениями констант задает отсчет позиции относительно начала файла, относительно текущего положения указателя позиции в нем или относительно конца файла. В качестве указанных констант могут быть взяты соответственно значения 0, 1, 2 или именованные константы SEEK_SET, SEEK_CUR, SEEK_END из заголовочного файла stdio.h. Поле l_len может быть задано числом 0, тогда блокировка распространяется от указанного в структуре начала файла до его конца (причем при дальнейшем увеличении файла в процессе работы с ним эта блокировка распространяется дальше – до текущего конца файла).

    В структуре данных flock тип блокировки, указываемый полем l_type , задается символическими константами, предварительно описанными в заголовочном файле. Эти константы следующие: F_RDLCK – установить на указанную в структуре область данных блокировку чтения; F_WRLCK – установить на указанную в структуре область данных блокировку записи; F_UNLCK – снять блокировку с указанной области. Функция fcntl может быть использована многократно для различных участков файла и для них с ее помощью могут быть установлены, изменены или сняты определенные виды блокировок.

    Блокировка по чтению (константой F_RDLCK) может быть установлена только в том случае, если файл, на который она устанавливается текущей программой, открыт для чтения (т.е. с режимом O_RDONLY или O_RDWR). Блокировка по записи (константой F_WRLCK) может быть установлена только, если файл, на который она устанавливается текущей программой, открыт данной программой для записи (т.е. с режимом O_WRONLY или O_RDWR).

    Блокировка чтения, задаваемая константой F_RDLCK, просто предотвращает установку другими процессами блокировки записи. Несколько процессов могут одновременно выполнять блокировку чтения для одного и того же участка файла. Блокировка по чтению может использоваться, чтобы предотвратить обновление данных, не скрывая их от просмотра другими процессами. Блокировка записи, задаваемая константой F_WRLCK, предотвращает установку другими процессами блокировок чтения и записи для файла. Для заданного участка файла может существовать только одна блокировка записи одновременно. Блокировка записи может использоваться для запрещения просмотра участков файла при выполнении обновлений.

    Блокировка по чтению на участок файла может устанавливаться независимо различными процессами, но блокировку по записи может установить только один процесс. Попытки других процессов установить такую блокировку, пока она не снята процессом, установившем ее, оказываются неудачными. Эта неудача проявляется в том, что при использовании операции SETLK функция fcntl возвращает значение ‑1, а при использовании операции SETLKW в функции fcntl процесс приостанавливается до снятия блокировки другим процессом.

    Заметим, что блокировка посредством вызова функции fcntl действует только, если ее использование систематически применяется всеми программами, обращающимися к файлу. Если некоторая программа обращается к тому же файлу операциями read или write без предварительных операций fcntl в попытках установить блокировку, то, к сожалению, никаких блокировок, предохраняющих несогласованное использование файла, не реализуется.

    Следующая программа, приведенная листингом 2.4.1, демонстрирует использование функций открытия файла, закрытия файла, записи в файл, задание ограничения совместного доступа и аналогична по выполняемым действиям программе в листинге 2.3.1, написанной для другой ОС.

    int fhandle;int fhandle;

    fhandle=open(fname, O_WRONLY | O_CREAT | O_TRUNC, 0600);

    len=read(0, buffer+16, 80); // записываем вводимое после начального текста

    write(fhandle, buffer, 16+len);

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

    В этом примере значение поля l_type структуры данных lock типа flock задается равным константе F_WRLCK, т.е. указывается блокировка при записи данной программой, которая равносильна запрету как по чтению, так и по записи для других процессов. Начальный адрес участка задается на основе начальной позиции в файле (константа SEEK_SET в поле l_whence ) со смещением в l_start , равным нулю, т.е. указывается, что управляемый участок начинается с самого начала файла. Значение поля l_len задано нулевым, что равносильно указанию распространения действий до конца файла. Таким образом указано, что воздействию запрета на доступ для других процессов подлежит весь файл. Рассматриваемый запрет на запись осуществляется вызовом функции fcntl(fhandle, F_SETLKW, &lock) сразу после открытия файла. Если в последующие моменты времени до снятия этой блокировки другой процесс выполняет аналогичную функцию fcntl(fhandle, F_SETLKW, &lock), то он приостанавливается на этой функции до тех пор, пока блокировка не будет снята.

    После записи в файл функция write задает отмену запрета на запись, установленного данным процессом. С этой целью выполняется функция fcntl(fhandle, F_SETLK, &lock), в параметре lock которой задано поле l_type , равное константе F_UNLCK, т.е. указывается отмена блокировки (того же участка, что и раньше был указан в этой структуре).

    Заметим, что если не требуется принимать мер по управлению совместным использованием файла, то в программе для Unix достаточно просто не использовать функцию fcntl для этих целей. В частности, для упрощения рассматриваемого примера можно было отбросить из программы вызовы функции fcntl , описание и установки полей экземпляра lock структуры flock . В программах же для операционных систем MS Windows и OS/2 во всех случаях приходится использовать те же функции, что и в более сложном случае, причем с заданием всех их параметров.

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

    BOOL LockFile(HANDLE hFile,

    Данная функция при удачном выполнении блокирует доступ к указанному в ней участку для всех других процессов. Эта функция предназначена в общем случае для работы с очень большими файлами, размер которых превосходит числа, задаваемые в формате DWORD (более чем 32-битные двоичные числа, что соответствует границе в 4Гбайта). Поэтому для задания смещения блокируемого участка используются два аргумента FileOffsetLow и FileOffsetHigh , задающие младшую и старшую части такого смещения. Аналогичным образом для задания числа байтов в блокируемом участке предназначены два аргумента nNumberOfBytesToLockLow и nNumberOfBytesToLockHigh , также задающие младшую и старшую части этого числа.

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

    Обратной к функции LockFile является системная функция UnlockFile, которая имеет прототип

    BOOL UnlockFile(HANDLE hFile,

    DWORD FileOffsetLow, DWORD FileOffsetHigh,

    DWORD cbUnlockLow, DWORD cbUnlockHigh),

    где аргументы по своему назначению совпадают с уже рассмотренными в функции LockFile. Данная функция снимает блокировку с указанного в ней участка, давая тем самым свободный доступ к нему, если это, конечно, согласуется с общими режимами доступа для других процессов, определяемыми аргументом ShareMode в функции открытия файла CreateFile.

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

    BOOL LockFileEx(HANDLE hFile, DWORD Flags,

    BOOL UnlockFileEx(HANDLE hFile, DWORD dwReserved,

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

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

    В двух последних функциях значение смещения рассматриваемого участка файла размещается внутри структуры данных, задаваемых последним аргументом. Как видим, полноценное блокирование участков файлов в ОС типа Windows задается в действительности еще сложней чем в Unix.

    Как удалить заблокированный в системе Windows файл или папку? Начнем с того, что не каждый файл или папку нужно удалять: так, например, важные файлы самой Windows защищены от пользовательского вмешательства, и для их удаления потребуется запросить разрешение от TrustedInstaller – скрытой системной учетной записи, которая на голову выше любой учетной записи администратора. Если речь идет о редких случаях осознанного и контролируемого процесса удаления файлов или папок, которому препятствует системное уведомление «Запросите разрешение от TrustedInstaller», полный доступ с разрешением TrustedInstaller можно получить в свойствах удаляемой папки или файла.

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

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

    В безопасном режиме работы Windows;

    Загрузившись с Live-дисков или даже обычного установочного носителя Windows;

    В другой Windows или иной операционной системе, установленной на другом разделе или диске компьютера.

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

    1. Unlocker

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

    Работая с утилитой из контекстного меню, на заблокированном файле, соответственно, выбираем пункт «Unlocker».

    Инсталлятор Unlocker настроен на установку в систему вместе с «довесками», необходимо внимательно отслеживать шаги мастера установки, чтобы убрать галочки попутного внедрения ненужного софта.

    2. Lock Hunter

    Утилита Lock Hunter от Unlocker отличается возможностью работы не только с файлами, но и с заблокированными папками. Lock Hunter предусматривает кнопку обзора внутри своего интерфейса для добавления заблокированных папок или файлов, утилита также встраивается в контекстное меню проводника Windows в виде вопроса «Что блокирует этот файл (папку)».

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

    3. UnlockMe

    Утилита UnlockMe, как и предыдущие участники обзора, работает с заблокированными папками и файлами как внутри собственного интерфейса, предусматривая кнопки добавления данных,

    так и посредством опции в контекстном меню проводника Windows.

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

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

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

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

    Удаление заблокированных файлов программой Unlocker

    Скачав Unlocker, нам нужно установить его на компьютер. Для этого запускаем наш файл и после чего нажимаем несколько раз кнопку «Далее». Исключение является только шаг, где нам предлагают установить «Delta Toolbar ». По умолчанию отмечен пункт «Quick», что повлечет за собой установку toolbara и замену домашней страницы на «Delta». Но, так как нам это не нужно, отмечаем «Advanced » и убираем галочки которые находятся ниже, затем переходим к следующему этапу установки. После окончания копирования и установки файлов жмем «Готово».

    Теперь осталось ею только воспользоваться, находим файл который мы хотим удалить, и правым кликом вызываем меню, где и находим пункт «Unlocker»

    После нажатия появится окно с выбором действия. Если Вы хотите удалить файл, соответственно выбираем «Удалить » и нажимаем «ОК »

    Так же, с помощью этой программы можно переименовать заблокированный файл. Выбрав «Переименовать», появится дополнительное окошко где нужно указать имя документа и после нажатия «ОК», название документа или папки изменится.

    Теперь удаление заблокированных файлов или папок, с таким помощником как Unlocker, не составит для Вас труда. Так же, встречаются такие случаи, что некоторые скрывают свои вредоносные файлы и для их удаления нужно . Если вам помогла статья, не забудьте поставить лайк или ретвитнуть и подписаться на RSS.

    Работая с ОС Windows, часто приходится сталкиваться с тяжело удаляемыми файлами. Если файл используется каким-то приложением, либо самой системой, обычным способом удалить его не получится. На многократные и нервозные нажатия клавиши «Delete» в лучшем случае система монотонно будет отвечать одно и то же: «Файл используется, и удалить его невозможно», при худших раскладах — компьютер зависнет.

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

    Самая простая причина блокировки файла – это работающее приложение, которое и блокирует его удаление.

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

    Перезагрузка компьютера

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

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

    Диспетчер задач Windows можно вызвать, введя «Диспетчер задач» в поле поиска меню «Пуск» и нажать «Enter», но есть и куда более простой способ – горячие клавиши «Ctrl+Shift+Esc». В списке работающих процессов Windows необходимо отыскать процессы приложений, которые могут использовать удаляемый файл, затем прекратить эти процессы с помощью соответствующей кнопки в окне диспетчера задач.

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

    Специальные программы для разблокировки файлов

    Специальные небольшие програмы с одной-единственной функцией разблокировки файлов давно стали программами «Must Have» для большинства пользователей ОС Windows. Часто такие утилиты входят в состав файловых менеджеров в числе встроенного софта.

    Unlocker или Lock Hunter – эти программы можно скачать в Интернете бесплатно, они минималистично и работают без каких-либо проблем.

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

    Затем нужно определиться с командой – переименовать файл, переместить его, просто разблокировать или удалить. В процессе разблокировки Unlocker покажет, какими приложениями файл в данный момент используется.

    Lock Hunter также интегрируется с Windows и доступна в контекстном меню системы.

    Да и прочий функционал точно такой же – переименование, перемещение, информация о процессах, использующих файл, разблокировка и удаление.

    В отличие от Unlocker, программа Lock Hunter не русифицирована, но, учитывая минималистичность функционала, вряд ли использованию программы помешает языковой барьер, тем боле, что интерфейс интуитивно понятен.

    Редко, но все же, и программные разблокировщики типа Unlocker или Lock Hunter не справляются с проблемой, обещая удалить заблокированный файл при перезагрузке, но так и не выполняют обещание. Часто с такой ситуацией могут сталкиваться сотрудники корпорации, которые работают в рамках гостевых учетных записей Windows с ограниченными пользовательскими правами.

    Удалить заблокированный файл можно попробовать, загрузив Windows в безопасном режиме. Чтобы попасть в этот режим для Windows ХР и 7 во время загрузки (или перезагрузки), нужно жать клавишу F8 и в появившемся меню вариантов загрузки выбрать безопасный режим с загрузкой только основных драйверов и служб.

    С Windows 8/8.1 все обстоит несколько сложнее, придется проделать некоторые настройки (обо всех нюансах безопасного режима Windows 8.1 мы уже рассказывали в этой статье с видео). Один из вариантов: в меню «Пуск» или с помощью горячих клавиш «Win+ R» нужно вызвать команду «Выполнить», ввести в ее поле «msconfig» и нажать «Enter».

    Во вкладке «Загрузки» нужно отметить галочкой «Безопасный режим» и оставить по умолчанию опцию «Минимальная». Далее – кнопка «Применить».

    Во всплывшем окне предупреждения о необходимости перезагрузки системы для вступления в силу изменений нужно нажать кнопку «Перезагрузка».

    После перезагрузки система зайдет в безопасный режим. Удалив заблокированный файл, важно не забыть вернуть настройки Windows 8/8.1 во вкладке «Загрузки» в былое состояние, чтобы вновь перезагрузиться уже в обычном режиме работы системы.

    Блокировка директории с РНР файлами

    На сервере есть директория my-files, в которой находятся РНР файлы, необходимые для работы системы. И кроме них два файла JS.

    РНР файлы вызываются либо самими РНР скриптами, либо JS, ссылки на которые стоят в коде страницы.

    Похоже, что роботы-качалки со ссылок кода страницы и через JS нашли некоторые из РНР файлов и запускают их с большой интенсивностью (20 раз в секунду).

    Можно ли закрыть все РНР файлы в папке my-files от доступа со стороны клиента?

    (Желательно закрыть именно именно файлы РНР, а доступ к JS оставить. Иначе придется JS куда-то переносить и многое переделывать).

    19.02.2020, 13:49

    Почему не работает РНР, не могу запустить ни один скрипт на РНР
    Помогите начинающему. Установил Apache и РНР. Апач работает нормально. Проблем нет. А вот с.

    Можно ли отправить файл на почту, не переместив её в директории на сервере с временной директории?
    Всем добрый день, вопрос такой. Можно ли обращаться к файлу до его перемещения с временной.

    Запрет/блокировка доступа к директории, файлу
    Всем привет. необходимо реализовать блокировку доступа к каталогу/файлу получилось так.

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

    QT ,массив с файлами из директории
    Добрый день . Есть код : int MainWindow::FunctionGetMusicFiles() < int i,n; n=.

    Способы организации файловых операций. Грамотная работа с файлами: исключительная блокировка файлов

    Оставьте комментарий 6,950

    Блокировки файлов

    Блокировки файлов и отдeльных записeй в файлах являются срeдством синхронизации мeжду работающими в коопeрации процeссами, пытающимися использовать один и тот жe файл одноврeмeнно.

    Процeссы могут имeть соотвeтствующиe права доступа к файлу, но одноврeмeнноe использованиe этих прав (в особeнности права записи) можeт привeсти к нeкоррeктным рeзультатам. Примeром такой ситуации являeтся одноврeмeнноe рeдактированиe одного и того жe докумeнта нeсколькими пользоватeлями. Eсли доступ к файлу нe управляeтся блокировками, то каждый пользоватeль, который имeeт право записи в файл, работаeт со своeй копиeй данных файла. Рeзультат такого рeдактирования нeпрeдсказуeм — он зависит от того, в какой послeдоватeльности записывали измeнeния в файл примeняeмыe пользоватeлями приложeния-рeдакторы.

    Многопользоватeльскиe опeрационныe систeмы обычно поддeрживают спeциальный систeмный вызов, позволяющий программисту установить и провeрить блокировки на файл и eго отдeльныe области. В UNIX такой систeмный вызов называeтся fcntl. В eго аргумeнтах указываeтся дeскриптор файла, для которого нужно установить или провeрить блокировки, тип опeрации (блокированиe или провeрка, блокированиe доступа для чтeния или для записи), а такжe область блокирования — смeщeниe от начала файла и размeр в байтах. При провeркe наличия блокировок, установлeнных другими процeссами, вызов fcntl нeмeдлeнно возвращаeт управлeниe с сообщeниeм рeзультата. При установкe блокировки можно задать два рeжима работы систeмного вызова: с пeрeходом процeсса в состояниe ожидания в том случаe, eсли блокировку установить нeвозможно (синхронный систeмный вызов), и с нeмeдлeнным возвратом в такой ситуации с сообщeниeм отрицатeльного рeзультата (асинхронный вызов). Запрошeнная блокировка записи нe можeт быть установлeна в том случаe, eсли другой процeсс ужe установил свою блокировку записи на тот жe файл. То eсть блокировка записи являeтся исключитeльной. Блокировки чтeния нe являются исключитeльными и могут устанавливаться на файл в том случаe, eсли их области дeйствия нe пeрeкрываются. Eсли на какую-то область файла установлeна блокировка чтeния, то на эту область нeльзя установить блокировку записи. В UNIX сущeствуют два рeжима дeйствия блокировок — консультативный (advisory) и обязатeльный (mandatory). Основным рeкомeндуeмым для использования рeжимом являeтся консультативный. При нeм опeрационная систeма нe занимаeтся блокированиeм опeраций с файлом, а только устанавливаeт признаки блокирования областeй в структурах file, поддeрживающих опeрации с файлами. Коопeрирующиeся процeссы обязатeльно должны провeрять наличиe блокировок на файл, чтобы синхронизировать свою работу. Eсли жe блокировки установлeны, но процeсс нe провeряeт их, то опeрационная систeма нe запрeщаeт доступ процeсса к файлу, когда процeсс дeлаeт систeмныe вызовы read или write.

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

    Непосредственное использование в Unix только функций открытия, закрытия, записи в файл и чтения из файла не обеспечивает полных возможностей совместного использования файлов. Для управления совместным доступом к открытым файлам Unix содержит дополнительные средства, обеспечиваемые через системную функцию fcntl. Функция эта имеет прототип

    int fcntl(int handle, int cmd, . . .).

    Параметр cmd задает операции, которые необходимо выполнить над файлом, указанным аргументом handle . Третий аргумент этой функции, который может быть указан после cmd , зависит от конкретного значения операции cmd . Имеется целый ряд возможных значений для аргумента операции функции fcntl, но большинство из них не будет рассматриваться здесь. Ограничимся только значениеми, относящимися к взаимной блокировке файлов и их записей. В этом случае функция fcntl приобретает вид

    int fcntl(int handle, int cmd, struct flock *ldata).

    Для этого варианта имеем три основных значения аргумента cmd . Они обозначаются символическими константами F_SETLK, F_SETLKW и F_GETLK. Структуры flock данных описываются в заголовочном файле в виде

    l _type; // тип блокировки

    short l _whence; // код базовой позиции для отсчета смещения

    off_t l _start; // смещение относительно базовой позиции

    off_t l _len; // сколько байтов находится в заблокированной области

    pid_t l _pid; // PID процесса, который блокировал файл

    Сами символические константы операций блокировок обозначают следующее. Константа F_SETLK задает попытку применить блокировку к файлу и немедленно возвратить управление либо же отменить блокировку, если это действие задано типом блокировки, равным F_UNLCK. При неудачной попытке наложения блокировки с операцией, заданной константой F_SETLK, функция fcntl возвращает код -1. Константа F_SETLKW приказывает попытаться применить блокировку к файлу и приостановить работу, если блокировка уже наложена другим процессом. Константа F_GETLK делает запрос на получение описания блокировки, отвечающей данным в аргументе ldata (возвращаемая информация описывает первую блокировку, препятствующую наложению блокировки, которая задается структурой ldata ).

    Код базовой позиции для отсчета смещения задает либо начальную позицию в файле (константой SEEK_SET), либо текущую позицию в нем (константой SEEK_CUR), либо позицию конца файла (константой SEEK_END).

    В пояснение описанных деталей отметим, что средства Unix позволяют управлять совместным доступом не только ко всему файлу, но и к отдельным участкам его. В частности, разрешить другим процессам только читать отдельные участки файла, а другим, может быть, разрешить изменять их. Поэтому указанные средства содержат не только указание разрешения вида доступа или соответственно запрета (блокировки) доступа, но и описание участка, к которому относится такой запрет. Именно с этой целью в состав структуры flock включены поля l_whence , l_start , l_len , причем поле l_len задает длину участка, на который распространяется действие конкретного вызова функции fcntl ; поле l_start задает начальное смещение рассматриваемого участка относительно точки позиции, указанной параметром l_ whence . Последний, в свою очередь, значениями констант задает отсчет позиции относительно начала файла, относительно текущего положения указателя позиции в нем или относительно конца файла. В качестве указанных констант могут быть взяты соответственно значения 0, 1, 2 или именованные константы SEEK_SET, SEEK_CUR, SEEK_END из заголовочного файла stdio.h. Поле l_len может быть задано числом 0, тогда блокировка распространяется от указанного в структуре начала файла до его конца (причем при дальнейшем увеличении файла в процессе работы с ним эта блокировка распространяется дальше – до текущего конца файла).

    В структуре данных flock тип блокировки, указываемый полем l_type , задается символическими константами, предварительно описанными в заголовочном файле. Эти константы следующие: F_RDLCK – установить на указанную в структуре область данных блокировку чтения; F_WRLCK – установить на указанную в структуре область данных блокировку записи; F_UNLCK – снять блокировку с указанной области. Функция fcntl может быть использована многократно для различных участков файла и для них с ее помощью могут быть установлены, изменены или сняты определенные виды блокировок.

    Блокировка по чтению (константой F_RDLCK) может быть установлена только в том случае, если файл, на который она устанавливается текущей программой, открыт для чтения (т.е. с режимом O_RDONLY или O_RDWR). Блокировка по записи (константой F_WRLCK) может быть установлена только, если файл, на который она устанавливается текущей программой, открыт данной программой для записи (т.е. с режимом O_WRONLY или O_RDWR).

    Блокировка чтения, задаваемая константой F_RDLCK, просто предотвращает установку другими процессами блокировки записи. Несколько процессов могут одновременно выполнять блокировку чтения для одного и того же участка файла. Блокировка по чтению может использоваться, чтобы предотвратить обновление данных, не скрывая их от просмотра другими процессами. Блокировка записи, задаваемая константой F_WRLCK, предотвращает установку другими процессами блокировок чтения и записи для файла. Для заданного участка файла может существовать только одна блокировка записи одновременно. Блокировка записи может использоваться для запрещения просмотра участков файла при выполнении обновлений.

    Блокировка по чтению на участок файла может устанавливаться независимо различными процессами, но блокировку по записи может установить только один процесс. Попытки других процессов установить такую блокировку, пока она не снята процессом, установившем ее, оказываются неудачными. Эта неудача проявляется в том, что при использовании операции SETLK функция fcntl возвращает значение ‑1, а при использовании операции SETLKW в функции fcntl процесс приостанавливается до снятия блокировки другим процессом.

    Заметим, что блокировка посредством вызова функции fcntl действует только, если ее использование систематически применяется всеми программами, обращающимися к файлу. Если некоторая программа обращается к тому же файлу операциями read или write без предварительных операций fcntl в попытках установить блокировку, то, к сожалению, никаких блокировок, предохраняющих несогласованное использование файла, не реализуется.

    Следующая программа, приведенная листингом 2.4.1, демонстрирует использование функций открытия файла, закрытия файла, записи в файл, задание ограничения совместного доступа и аналогична по выполняемым действиям программе в листинге 2.3.1, написанной для другой ОС.

    int fhandle;int fhandle;

    fhandle=open(fname, O_WRONLY | O_CREAT | O_TRUNC, 0600);

    len=read(0, buffer+16, 80); // записываем вводимое после начального текста

    write(fhandle, buffer, 16+len);

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

    В этом примере значение поля l_type структуры данных lock типа flock задается равным константе F_WRLCK, т.е. указывается блокировка при записи данной программой, которая равносильна запрету как по чтению, так и по записи для других процессов. Начальный адрес участка задается на основе начальной позиции в файле (константа SEEK_SET в поле l_whence ) со смещением в l_start , равным нулю, т.е. указывается, что управляемый участок начинается с самого начала файла. Значение поля l_len задано нулевым, что равносильно указанию распространения действий до конца файла. Таким образом указано, что воздействию запрета на доступ для других процессов подлежит весь файл. Рассматриваемый запрет на запись осуществляется вызовом функции fcntl(fhandle, F_SETLKW, &lock) сразу после открытия файла. Если в последующие моменты времени до снятия этой блокировки другой процесс выполняет аналогичную функцию fcntl(fhandle, F_SETLKW, &lock), то он приостанавливается на этой функции до тех пор, пока блокировка не будет снята.

    После записи в файл функция write задает отмену запрета на запись, установленного данным процессом. С этой целью выполняется функция fcntl(fhandle, F_SETLK, &lock), в параметре lock которой задано поле l_type , равное константе F_UNLCK, т.е. указывается отмена блокировки (того же участка, что и раньше был указан в этой структуре).

    Заметим, что если не требуется принимать мер по управлению совместным использованием файла, то в программе для Unix достаточно просто не использовать функцию fcntl для этих целей. В частности, для упрощения рассматриваемого примера можно было отбросить из программы вызовы функции fcntl , описание и установки полей экземпляра lock структуры flock . В программах же для операционных систем MS Windows и OS/2 во всех случаях приходится использовать те же функции, что и в более сложном случае, причем с заданием всех их параметров.

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

    BOOL LockFile(HANDLE hFile,

    Данная функция при удачном выполнении блокирует доступ к указанному в ней участку для всех других процессов. Эта функция предназначена в общем случае для работы с очень большими файлами, размер которых превосходит числа, задаваемые в формате DWORD (более чем 32-битные двоичные числа, что соответствует границе в 4Гбайта). Поэтому для задания смещения блокируемого участка используются два аргумента FileOffsetLow и FileOffsetHigh , задающие младшую и старшую части такого смещения. Аналогичным образом для задания числа байтов в блокируемом участке предназначены два аргумента nNumberOfBytesToLockLow и nNumberOfBytesToLockHigh , также задающие младшую и старшую части этого числа.

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

    Обратной к функции LockFile является системная функция UnlockFile, которая имеет прототип

    BOOL UnlockFile(HANDLE hFile,

    DWORD FileOffsetLow, DWORD FileOffsetHigh,

    DWORD cbUnlockLow, DWORD cbUnlockHigh),

    где аргументы по своему назначению совпадают с уже рассмотренными в функции LockFile. Данная функция снимает блокировку с указанного в ней участка, давая тем самым свободный доступ к нему, если это, конечно, согласуется с общими режимами доступа для других процессов, определяемыми аргументом ShareMode в функции открытия файла CreateFile.

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

    BOOL LockFileEx(HANDLE hFile, DWORD Flags,

    BOOL UnlockFileEx(HANDLE hFile, DWORD dwReserved,

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

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

    В двух последних функциях значение смещения рассматриваемого участка файла размещается внутри структуры данных, задаваемых последним аргументом. Как видим, полноценное блокирование участков файлов в ОС типа Windows задается в действительности еще сложней чем в Unix.

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

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

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

    Удаление заблокированных файлов программой Unlocker

    Скачав Unlocker, нам нужно установить его на компьютер. Для этого запускаем наш файл и после чего нажимаем несколько раз кнопку «Далее». Исключение является только шаг, где нам предлагают установить «Delta Toolbar ». По умолчанию отмечен пункт «Quick», что повлечет за собой установку toolbara и замену домашней страницы на «Delta». Но, так как нам это не нужно, отмечаем «Advanced » и убираем галочки которые находятся ниже, затем переходим к следующему этапу установки. После окончания копирования и установки файлов жмем «Готово».

    Теперь осталось ею только воспользоваться, находим файл который мы хотим удалить, и правым кликом вызываем меню, где и находим пункт «Unlocker»

    После нажатия появится окно с выбором действия. Если Вы хотите удалить файл, соответственно выбираем «Удалить » и нажимаем «ОК »

    Так же, с помощью этой программы можно переименовать заблокированный файл. Выбрав «Переименовать», появится дополнительное окошко где нужно указать имя документа и после нажатия «ОК», название документа или папки изменится.

    Теперь удаление заблокированных файлов или папок, с таким помощником как Unlocker, не составит для Вас труда. Так же, встречаются такие случаи, что некоторые скрывают свои вредоносные файлы и для их удаления нужно . Если вам помогла статья, не забудьте поставить лайк или ретвитнуть и подписаться на RSS.

    Как удалить заблокированный в системе Windows файл или папку? Начнем с того, что не каждый файл или папку нужно удалять: так, например, важные файлы самой Windows защищены от пользовательского вмешательства, и для их удаления потребуется запросить разрешение от TrustedInstaller – скрытой системной учетной записи, которая на голову выше любой учетной записи администратора. Если речь идет о редких случаях осознанного и контролируемого процесса удаления файлов или папок, которому препятствует системное уведомление «Запросите разрешение от TrustedInstaller», полный доступ с разрешением TrustedInstaller можно получить в свойствах удаляемой папки или файла.

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

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

    В безопасном режиме работы Windows;

    Загрузившись с Live-дисков или даже обычного установочного носителя Windows;

    В другой Windows или иной операционной системе, установленной на другом разделе или диске компьютера.

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

    1. Unlocker

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

    Работая с утилитой из контекстного меню, на заблокированном файле, соответственно, выбираем пункт «Unlocker».

    Инсталлятор Unlocker настроен на установку в систему вместе с «довесками», необходимо внимательно отслеживать шаги мастера установки, чтобы убрать галочки попутного внедрения ненужного софта.

    2. Lock Hunter

    Утилита Lock Hunter от Unlocker отличается возможностью работы не только с файлами, но и с заблокированными папками. Lock Hunter предусматривает кнопку обзора внутри своего интерфейса для добавления заблокированных папок или файлов, утилита также встраивается в контекстное меню проводника Windows в виде вопроса «Что блокирует этот файл (папку)».

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

    3. UnlockMe

    Утилита UnlockMe, как и предыдущие участники обзора, работает с заблокированными папками и файлами как внутри собственного интерфейса, предусматривая кнопки добавления данных,

    так и посредством опции в контекстном меню проводника Windows.

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

    Работая с ОС Windows, часто приходится сталкиваться с тяжело удаляемыми файлами. Если файл используется каким-то приложением, либо самой системой, обычным способом удалить его не получится. На многократные и нервозные нажатия клавиши «Delete» в лучшем случае система монотонно будет отвечать одно и то же: «Файл используется, и удалить его невозможно», при худших раскладах — компьютер зависнет.

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

    Самая простая причина блокировки файла – это работающее приложение, которое и блокирует его удаление.

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

    Перезагрузка компьютера

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

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

    Диспетчер задач Windows можно вызвать, введя «Диспетчер задач» в поле поиска меню «Пуск» и нажать «Enter», но есть и куда более простой способ – горячие клавиши «Ctrl+Shift+Esc». В списке работающих процессов Windows необходимо отыскать процессы приложений, которые могут использовать удаляемый файл, затем прекратить эти процессы с помощью соответствующей кнопки в окне диспетчера задач.

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

    Специальные программы для разблокировки файлов

    Специальные небольшие програмы с одной-единственной функцией разблокировки файлов давно стали программами «Must Have» для большинства пользователей ОС Windows. Часто такие утилиты входят в состав файловых менеджеров в числе встроенного софта.

    Unlocker или Lock Hunter – эти программы можно скачать в Интернете бесплатно, они минималистично и работают без каких-либо проблем.

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

    Затем нужно определиться с командой – переименовать файл, переместить его, просто разблокировать или удалить. В процессе разблокировки Unlocker покажет, какими приложениями файл в данный момент используется.

    Lock Hunter также интегрируется с Windows и доступна в контекстном меню системы.

    Да и прочий функционал точно такой же – переименование, перемещение, информация о процессах, использующих файл, разблокировка и удаление.

    В отличие от Unlocker, программа Lock Hunter не русифицирована, но, учитывая минималистичность функционала, вряд ли использованию программы помешает языковой барьер, тем боле, что интерфейс интуитивно понятен.

    Редко, но все же, и программные разблокировщики типа Unlocker или Lock Hunter не справляются с проблемой, обещая удалить заблокированный файл при перезагрузке, но так и не выполняют обещание. Часто с такой ситуацией могут сталкиваться сотрудники корпорации, которые работают в рамках гостевых учетных записей Windows с ограниченными пользовательскими правами.

    Удалить заблокированный файл можно попробовать, загрузив Windows в безопасном режиме. Чтобы попасть в этот режим для Windows ХР и 7 во время загрузки (или перезагрузки), нужно жать клавишу F8 и в появившемся меню вариантов загрузки выбрать безопасный режим с загрузкой только основных драйверов и служб.

    С Windows 8/8.1 все обстоит несколько сложнее, придется проделать некоторые настройки (обо всех нюансах безопасного режима Windows 8.1 мы уже рассказывали в этой статье с видео). Один из вариантов: в меню «Пуск» или с помощью горячих клавиш «Win+ R» нужно вызвать команду «Выполнить», ввести в ее поле «msconfig» и нажать «Enter».

    Во вкладке «Загрузки» нужно отметить галочкой «Безопасный режим» и оставить по умолчанию опцию «Минимальная». Далее – кнопка «Применить».

    Во всплывшем окне предупреждения о необходимости перезагрузки системы для вступления в силу изменений нужно нажать кнопку «Перезагрузка».

    После перезагрузки система зайдет в безопасный режим. Удалив заблокированный файл, важно не забыть вернуть настройки Windows 8/8.1 во вкладке «Загрузки» в былое состояние, чтобы вновь перезагрузиться уже в обычном режиме работы системы.

    Мастер Йода рекомендует:  Асинхронный JavaScript и XML (AJAX)
  • Добавить комментарий