Как создать временные файлы
Что такое временные файлы в Windows
Почему создаются временные файлы
Временные файлы Windows создаются операционной системой при нормальной работе ОС, когда может не хватить памяти, выделенной для этой задачи.
Программное обеспечение, которое использует большие объемы данных для редактирования графики, видео и мультимедиа, также создают временные файлы. Такие временные файлы создаются часто и остаются в системе, даже когда задача уже выполнена, что может в итоге привести к сокращению места на диске.
Временные файлы создаются также для целей резервного копирования. Например, Майкрософт офис сохраняет временные файлы открытого документа каждые несколько минут. Если сохранить документ и выйти, временный файл удаляется. Если программа неожиданно зависает, временный файл не удаляется. Таким образом, они могут быть полезны, чтобы помочь восстановить потерянные данные, если программа зависла или были системные сбои.
В идеале, временные файлы должны быть удалены после того, как программа завершает свою работу. Но это не всегда так, что приводит к нерациональному использованию дискового пространства.
Где находятся временные файлы
Временные файлы в Windows, как правило, находятся в двух местах:
- %systemdrive%\Windows\Temp
- %userprofile%\AppData\Local\Temp
Эта папка обычно находится в C:\Users\username\AppData\Local\Temp и создается для каждого пользователя. Это скрытая папка, и вам придется сначала в свойствах папки установить показывать скрытые Системные папки, прежде чем вы сможете увидеть её.
Временные файлы, создаваемые операционной системы Windows, которые обычно хранятся в папке %system%\Windows\Temp, создаются пользователем при запуске любого программного обеспечения которое хранится в профиле пользователя, в папке %userprofiles%\AppData\Local\.
Временные файлы определенного программного обеспечения могут также быть расположены в суб-папке внутри родительской папки конкретного программного обеспечения.
В редких случаях, временный файл или временная папка могут быть созданы в корневом каталоге на диске C (системный диск). Вы можете просмотреть папку в деталях, а затем удалить её, если Вы не уверены, что она действительно содержит временные файлы.
Изменение расположения папки Temp
Но помните, по соображениям безопасности, лучше никогда не совмещайте временные каталоги вместе для всех профилей пользователей, поскольку были случаи уязвимостей с временными файлами, за счет определенной программы неправильного разрешения файла или других условий.
Очистить папку временных файлов
Вы можете использовать бесплатные программы чистильщики ненужных файлов, такие как CCleaner, или встроенную утилиту очистки диска, чтобы легко очистить содержимое папки Temp.
Планируете очистить содержимое вашего установщика в Windows папке или папку winsxs в каталоге из-за её абсолютно большого размера!? Подумайте еще раз!
Когда PHP-программисту необходимо создать временный файл, он в мануале находит функцию tmpfile() и после изучения примеров начинает думать, как её лучше применить. Так было и со мной, когда мне потребовалось выгрузить данные сразу во временный файл, а не работать с ними через переменную. Но с файлом, созданным таким образом, в дальнейшем неудобно работать в силу того, что tmpfile() возвращает дескриптор, а не ссылку на локальный файл. Давайте немного углубимся в анатомию временного файла и рассмотрим подводные камни, с которыми мне пришлось столкнуться.
Временные файлы в PHP нужны, например, для загрузки большого количества данных из сети или выгрузки данных из БД. Сохранять мега- или гигабайты дынных в переменной не самая лучшая идея, поскольку потребление памяти интерпретатором и сервером ограничено. Лучшим вариантом является сохранение данных на диске и удаление их по результату обработки. Функция tmpfile() именно так и работает, но в PHP существуют и другие нативные способы, с помощью которых можно организовать работу с временными данными:
Временные данные, созданные через fopen() или tmpfile() , будут уничтожены самим PHP после завершения скрипта или когда вы принудительно закроете ресурс с помощью функции fclose() . Если будет брошено исключение, PHP всё равно уничтожит временные данные, но если вылетит фатальная ошибка или вы просто вызовете exit() , нет гарантий, что временные данные будут удалены.
Получаем URI временного файла
У вас может появиться необходимость «придержать» временные данные и поработать с ними на уровне физических файлов. Этого можно достичь, если открыть поток php://temp/maxmemory:0 или вызвать tmpfile() , а затем, до закрытия ресурса, воспользоваться stream_get_meta_data() , чтобы извлечь метаданные и узнать абсолютный путь к файлу для дальнейших манипуляций:
Какие значения возвращает stream_get_meta_data() хорошо описано в документации, но нас больше интересует абсолютный путь к файлу, связанный с потоком. Его можно извлечь по ключу uri из полученного массива:
В случае с php://temp/maxmemory:0 мы не сможем получить URI файла из метаданных потока, но фактически файл будет создан во временной папке. Функция stream_get_meta_data() по ключу uri будет возвращать название потока. Поэтому для получения URI временного файла на диске, нужно использовать функцию tmpfile() . Другого способа узнать, где физически хранится временный файл, не существует.
Существует класс SplTempFileObject, который является всего лишь ООП-обёрткой на потоком php://temp и не более. Данный класс наследуется от SplFileObject, а тот в свою очередь от SplFileInfo. Это значит, что у SplTempFileObject должны быть доступны такие методы, как getFilename() , getPathInfo() , getSize() , но они не отработают так, как ожидается. Начиная с версии 5.3 закрался баг, который возвращает false для вышеперечисленных методов. В версии 7.4 ничего не изменилось.
Проблемы функции tmpfile()
Когда вы получили URI временного файла и записали в него данные, может потребоваться сохранить этот файл в нужной вам папке на диске. Проще всего и правильнее сделать это через функцию rename() , т. е. просто переименовать файл вместо физического перемещения данных.
К сожалению, сохранить временный файл через rename() не получится, т. к. tmpfile() для Windows накладывает блокирующий режим и файл будет всё ещё занят другим процессом. В UNIX-системах такой проблемы нет, здесь временный файл можно удалять ещё до закрытия ресурса. Другими словами, для Windows вызов rename() до fclose() приведёт к ошибке:
Использовать rename() после fclose() не целесообразно, т. к. после закрытия ресурса PHP сразу же удалит временный файл. Тем не менее, мы можем сохранить временный файл через копирование, воспользовавшись функцией copy() . Этот способ рабочий, но при копировании временного файла на сервере будет храниться две копии файла до завершения скрипта.
Создание временного файла
Для альтернативного решения создадим свой временный файл, который будет базироваться на функции tempnam() . Функция только создаёт файл с уникальным именем на диске, но автоматическое удаление файла не предусмотрено. Поэтому для его уничтожения нам понадобится написать свой обработчик. Жизненный цикл временного файла будет следующий: 1) создание файла во временной папке; 2) манипуляции с файлом; 3) автоматическое удаление.
Первым аргументом указывается расположение временной папки через sys_get_temp_dir() , а вторым — префикс в имени файла. Такой файл доступен для чтения и записи только владельцу, т. к. создаётся с правами 0600 (rw-). Для реализации автоматического удаления файла можно перенести дальнейшую логику в класс, где с помощью __destruct() попробуем удалить файл:
Объект вернёт ссылку на файл, который создала функция tempnam() , т. к. в классе прописан __toString() . Таким образом, мы избавились от работы с ресурсом. Временный файл будет удалён при освобождении всех ссылок на объект или по завершению скрипта, но до того случая, пока не будет вызвана фатальная ошибка, брошено исключение или вызвана функция exit() .
Полагаться на __destruct() плохая идея, т. к. в языках с автоматическим управлением памятью, нельзя быть уверенным на 100% в том, когда он выполнится. Деструктор не должен оставлять объект в нестабильном состоянии, поэтому в PHP обработчики уничтожения и освобождения объекта отделены друг от друга. Обработчик освобождения вызывается, когда движок полностью уверен, что объект больше нигде не применяется.
Для гарантированного удаления временного файла мы можем зарегистрировать свою функцию, которая выполнится в любом случае после завершения скрипта. Делается это с помощью register_shutdown_function() в конструкторе нашего класса:
Мы вынесли обработчик удаления временного файла в статическое замыкание, чтобы отвязать все ссылки от объекта и сохранить вызов __destruct до register_shutdown_function :
Класс TmpFile избегает ситуации, когда на него по умолчанию открыт дескриптор. Теперь можно использовать rename() вместо copy() и не бояться, когда при сохранении временных данных в другой файл на диске хранится две копии до завершения скрипта. Главное не держать открытый дескриптор, чтобы rename() наверняка отработала в Windows.
Также мы получили возможность типизировать временный файл и декларировать его тип через конструктор или методы классов, чтобы быть увереным, что приходит временный файл, а не строка, т. к. в PHP нет валидации на тип resource в сигнатурах.
Пример с загрузкой файлов
Бизнес-логика предполагала валидацию файла на другом уровне и здесь важно было позаботиться об удалении файла в самом начале его пути, если проверка будет провалена. С помощью функции register_shutdown_function() мы можем гарантировать, что временный файл будет удалён, когда скрипт завершится. В сниппете ниже приведён пример того, как был использован класс TmpFile вместо tmpfile() :
Временный файл в CLI и try-finally
В вебе запросы пользователей живут относительно недолго, но в CLI скрипты могут выполняться бесконечно и гарантировать выполнение функции register_shutdown_function() мы не можем. Скрипт может быть убит на системном уровне или выполнятся так долго, что все временные файлы останутся лежать без их финальной обработки. В консоле лучшим способом удаления временных файлов является использование конструкции try-finally :
Здесь процесс удаления временного файла мы помещаем в блок finally , который выполнится сразу после выхода из коллбека. В долгоживущих консольных приложениях это самый оптимальный способ обработать удаление временного файла, но при фатальных ошибках код до finally не дойдёт, а использование register_shutdown_function() не желательно, поэтому не остаётся ничего другого, как писать валидный код в секции try .
Чем класс TmpFile отличается от tmpfile()
Ниже привожу сравнительную таблицу между new TmpFile() и tmpfile() . Основные отличия заключаются в удалении временного файла: TmpFile удаляет файл по завершению скрипта или при освобождении всех ссылок на него, а tmpfile() — сразу после закрытия ресурса.
На основе идей из этой статьи, я написал менеджер для управления временными файлами, который доступен в репозитории denisyukphp/tmpfile-manager. Менеджер умеет много полезного: 1) настраивать путь к папке с временными файлами; 2) задавать префикс временным файлам; 3) закрывать отрытые ресурсы на временные файлы; 4) автоматически или вручную очищать временные файлы; 5) запускать свой сборщик мусора.
Вы можете использовать TmpFile независимо от менеджера, но TmpFileManager позволяет получить больше контроля над временными файлами и может гарантировать их удаление.
В некоторых случаях вам может понадобиться создать временный файл в Java. Это может быть в случае тестов модулей, когда нет необходимости сохранять результаты.
В этой статье вы научитесь способам создания временных файлов в Java. Есть два статических метода с названием createTempFile в классе Java File, один из них требует два аргумента а другой - три. Это поможет создать временный файл в местоположении по умолчанию временного каталога, а также используется для создания временного файла в указанном месте.
1. Используйте метод File.createTempFile(String prefix, String suffix)¶
Formal Syntax¶
Это легкий способ создания временного файла в временном каталоге операционной системы.
Этот метод создает пустой файл в каталоге по умолчанию для временного файла, используя указанный префикс и суффикс для создания названия этого файла. Использование этого метода эквивалентно к использованию createTempFile(prefix, suffix, null).
Он возвращает абстрактный путь, который указывает на только что созданный пустой файл.
Данный метод имеет следующие параметры:
- prefix - используется для создания названия файла и может иметь как минимум три символа.
- suffix -используется для создания названия файла и может быть null, в случае которого будет использован суффикс ".tmp". /li>
Пример¶
Результат будет иметь следующий вид:
Результат¶
Временный файл не будет удален после того, как Java программа завершила работу, если вы не создали второй временный Java файл, вызывающий метод deleteOnExit класса Java File. Этот аргумент влияет на то, как будет работать ваш временный файл Java.2. Используйте метод File.createTempFile(String prefix, String suffix, File directory)¶
Формальный синтаксис¶
Этот метод создает пустой файл в указанном временном каталоге, используя предоставленный префикс и суффикс для создания названия.
Аргумент префикса должен иметь как минимум три символа. Рекомендуется использовать короткий префикс и значащую строку, например, "ffn" or "mail". Аргумент суффикса может быть null, в случае которого будет использован суффикс ".tmp".
Для создания нового файла префикс и суффикс сначала должны быть установлены так, чтобы они соответствовали ограничениям базовой платформы. Если префикс слишком длинный, он будет срезан, но первые три символа всегда сохраняются. Если суффикс слишком длинный он также будет срезан, но если он начинается точкой ('.'), точка и первые три символа после нее всегда сохраняются. Когда эти регулирования готовы, будет создано название нового файла с помощью объединения префикса, пяти или более символов и суффикса.
Данный метод имеет следующие параметры:
- Префикс (prefix) - The prefix string to be used in generating the file's name; must be at least three characters long.
- Суффикс (suffix) - The suffix string to be used in generating the file's name; may be null, in which case the suffix ".tmp" will be used.
- Каталог (directory) - The directory in which the file is to be created, or null if the default temporary-file directory is to be used.
А теперь увидим этот метод в работе:
Пример¶
Результат будет иметь следующий вид:
Резульат
В случае тестов модулей, используемых JUnit, можете также использовать TemporaryFolder. TemporaryFolder Rule позволяет создать файлы и папки, которые должны быть удалены при завершении тестового метода независимо от его результата.В заключении здесь увидите некоторые заметки относительно временных файлов класса Java File:
Python предоставляет модуль, известный как tempfile , который упрощает создание и обработку временных файлов. Этот модуль предоставляет несколько методов для создания временных файлов и каталогов различными способами. tempfile пригодится всякий раз, когда вы захотите использовать временные файлы для хранения данных в программе Python. Давайте рассмотрим несколько различных примеров того, как можно использовать модуль tempfile .
Создание временного файла
Предположим, вашему приложению нужен временный файл для использования в программе, то есть он создаст один файл, будет использовать его для хранения некоторых данных, а затем удалит его после использования. Для этого мы можем использовать функцию Temporary File () .
Эта функция создаст один временный файл в расположении по умолчанию tempfile . Это расположение может отличаться в разных операционных системах. Лучше всего то, что временный файл, созданный Temporary File () , будет автоматически удален всякий раз, когда он будет закрыт. Кроме того, он не создает никакой ссылки на этот файл в таблице файловой системы системы. Это делает его закрытым для текущего приложения, то есть никакая другая программа не сможет открыть файл.
Давайте взглянем на приведенную ниже программу Python, чтобы увидеть, как она работает:
Он напечатает нижеприведенный вывод:
- Чтобы создать один временный файл в Python, вам нужно импортировать модуль tempfile .
- Как было объяснено выше, мы создали временный файл с помощью функции Temporary File () .
- Из выходных данных вы можете видеть, что созданный объект на самом деле не является файлом, это файлоподобный объект. И параметр mode (не показанный в нашем примере) созданного файла равен w+b , то есть вы можете читать и писать без закрытия.
- Созданный временный файл не имеет имени.
- Наконец, мы закрываем файл с помощью метода close () . Он будет уничтожен после того, как его закроют.
Создайте именованный временный файл
В нашем предыдущем примере мы видели, что временный файл, созданный с помощью функции Temporary File () , на самом деле является файлоподобным объектом без фактического имени файла. Python также предоставляет другой метод, NamedTemporaryFile() , для создания файла с видимым именем в файловой системе. Кроме указания имени для tempfile, NamedTemporaryFile() работает так же, как Temporary File() . Теперь давайте воспользуемся тем же приведенным выше примером для создания именованного временного файла:
Запуск этого кода приведет к печати вывода, аналогичного следующему:
Итак, на этот раз у созданного файла действительно есть имя. Преимущество NamedTemporaryFile() заключается в том, что мы можем сохранить имя созданных временных файлов и использовать их позже, прежде чем закрывать или уничтожать их. Если параметр delete имеет значение False , то мы можем закрыть файл без его уничтожения, что позволит нам снова открыть его позже.
Предоставление суффикса или префикса к имени
Иногда нам нужно добавить префикс или суффикс к имени временного файла. Это поможет нам идентифицировать все временные файлы, созданные нашей программой.
Запуск этого кода приведет к печати следующих выходных данных:
Таким образом, если мы передадим два дополнительных аргумента suffix и prefix функции NamedTemporaryFile () , она автоматически добавит их в начало и конец имени файла.
Поиск расположения временных файлов по умолчанию
Переменная tempfile.tempdir содержит расположение по умолчанию для всех временных файлов. Если значение tempdir равно None или unset, Python будет искать стандартный список каталогов и устанавливает tempdir в первое значение каталога, но только в том случае, если вызывающая программа может создать в нем файл. Ниже приведен список каталогов, которые он будет сканировать, в следующем порядке:
- Каталог, названный переменной окружения TMPDIR.
- Каталог, названный переменной среды TEMP.
- Каталог, названный переменной среды TMP
- Каталоги для конкретной платформы:
- На окнах, C:\TEMP, C:\TMP, \TEMP и \TMP, в том же порядке.
- На других платформах/tmp,/var/tmp и/usr/tmp расположены в том же порядке.
Чтобы узнать расположение временных файлов по умолчанию, мы можем вызвать метод tempfile.gettempdir () . Он вернет значение tempdir , если это не так None . В противном случае он сначала будет искать местоположение каталога, используя шаги, упомянутые выше, а затем вернет его.
Если вы запустите приведенную выше программу, она выведет результат, подобный следующему:
Вы можете видеть, что первое местоположение временного каталога является системным местоположением каталога, а второе значение временного каталога совпадает с тем, которое мы определили.
Чтение и запись данных из временных файлов
Мы узнали, как создать временный файл, создать временный файл с именем и как создать временный файл с суффиксом и/или префиксом. Теперь давайте попробуем понять, как на самом деле читать и записывать данные из временного файла в Python.
Чтение и запись данных из временного файла в Python довольно просты. Для записи вы можете использовать метод write () , а для чтения-метод read () . Например:
Это выведет выходные данные как 'hello world!' так как метод write() принимает входные данные в байтах (отсюда и префикс b в строке).
Если вы хотите записать текстовые данные во временный файл, вы можете использовать вместо этого метод writelines () . Для использования этого метода нам нужно создать tempfile с использованием режима w+t вместо режима по умолчанию w+b . Для этого в Temporary File () можно передать параметр mode param для изменения режима созданного временного файла.
Создание временного каталога
Если ваша программа имеет несколько временных файлов, может быть удобнее создать один временный каталог и поместить в него все ваши временные файлы. Чтобы создать временный каталог, мы можем использовать функцию Temporary Directory () . После того как все временные файлы будут закрыты, нам нужно удалить каталог вручную.
Он напечатает нижеприведенный вывод:
Создайте безопасный временный файл и каталог
Используя mkstemp() , мы можем создать временный файл самым безопасным способом. Временный файл, созданный с помощью этого метода, доступен для чтения и записи только по идентификатору создающего пользователя. Мы можем передать аргументы prefix и suffix , чтобы добавить префикс и суффикс к созданному имени файла. По умолчанию он открывает файл в двоичном режиме. Чтобы открыть его в текстовом режиме, мы можем передать text=True в качестве аргумента функции. В отличие от Temporary File() , файл, созданный mkstemp () , не удаляется автоматически после его закрытия.
Как вы можете видеть в приведенном ниже примере, пользователь несет ответственность за удаление файла.
Подобно mkstemp() , мы можем создать временный каталог наиболее безопасным способом, используя метод mkdtemp () . И опять же, как и mkstemp() , он также поддерживает аргументы prefix и suffix для добавления префикса и суффикса к имени каталога.
Вывод
В этой статье мы изучили различные способы создания временных файлов и каталогов в Python. Вы можете использовать временные файлы в любой программе Python, которую вы хотите. Но просто убедитесь, что вы удалили его, если конкретный используемый метод не удаляет его автоматически сам по себе. Также имейте в виду, что поведение может отличаться в разных операционных системах, например, имена выходных каталогов и имена файлов.
Все эти функции, которые мы объяснили выше, работают со многими различными аргументами, хотя мы не рассматривали подробно, какой тип аргументов принимает каждая функция. Если вы хотите узнать больше о модуле tempfile , вам следует ознакомиться с официальной документацией Python 3 .
Доступ к файловой системе из кода конфигурации
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. При обращении из кода конфигурации к файлам и каталогам файловой системы следует иметь в виду, что доступ к ним ограничен правами пользователя операционной системы, от имени которого запущено приложение.
1.1. Если доступ к файловой системе осуществляется из кода, выполняемого на клиенте, то он выполняется под правами пользователя, от имени которого запущено приложение (тонкий, толстый или веб-клиент). Как правило, это текущий пользователь операционной системы.
1.2. Если доступ к файловой системе осуществляется из кода, выполняемого на сервере, то:
- при использовании клиент-серверной информационной базы, доступ ограничен правами пользователя, от имени которого запущен сервер 1С:Предприятия (*);
- при использовании файловой базы, опубликованной на веб-сервере, доступ ограничен правами пользователя, от имени которого запущен веб-сервер.
* Рабочие процессы могут быть также запущены от имени другого пользователя, отличного от того, под которым запускается агент сервера. Подробнее см. руководство администратора клиент-серверного варианта, описание служебного файла swpuser.ini
Область применения (уточнение): управляемое приложение, обычное приложение.
2. Запрещается выполнять запись каких-либо файлов в каталог исполняемых файлов 1С:Предприятия, получаемого с помощью метода КаталогПрограммы . Использование метода КаталогПрограммы допустимо только для чтения или запуска файлов. Например, при работе в ОС Windows, для запуска копии тонкого клиента 1С:Предприятия текущей версии, допустимо использовать:
3. Даже если не планируется локализация конфигурации на другие языки, следует обеспечивать переносимость файлов, сформированных из кода конфигурации, между различными операционными системами с различными кодировками. Для этого необходимо:
3.1. В именах файлов, автоматически формируемых из кода конфигурации, указывать только английские буквы, а также цифры, а в качестве кодировки текстовых файлов использовать только UTF-8 (именно этот формат предпочтителен, т.к. только с ним корректно работает операционная система macOS).
3.2. В тех случаях, когда имя файла не генерируется системой, а его явно вводит пользователь, разрешить ввод русскоязычных имен, но при этом дать возможность транслитерировать его в англоязычное имя. По умолчанию, если это технически возможно и не снижает удобство работы, рекомендуется предлагать англоязычное имя файла, а для текстовых файлов – сохранение в кодировке UTF-8.
Также эти рекомендации по выбору имени и кодировки файла следует разместить в справке к тем местам программы, где пользователь имеет возможность сохранять файлы и выбирать кодировку.
В конфигурациях на базе Библиотеки стандартных подсистем для транслитерации имен файлов рекомендуется использовать функцию СтроковыеФункцииКлиентСервер.СтрокаЛатиницей .
Работа с временными файлами и каталогами
При необходимости использования временных файлов и каталогов необходимо соблюдать следующие требования:
1. Для получения имени временного файла следует использовать метод ПолучитьИмяВременногоФайла (исключение составляет веб-клиент, см. ниже п. 3). В противном случае возможна некорректная работа конфигурации в многопользовательском режиме, с включенными профилями безопасностями, возникновение проблем с правами доступа к файлам операционной системы, а также неконтролируемое увеличение количества ненужных временных файлов, которые не будут своевременно удалены.
ИмяПромежуточногоФайла = "C:\Временные файлы 1С\TempFile.xml";
Данные.Записать(ИмяПромежуточногоФайла);У текущего пользователя может не быть прав на запись в указанный каталог. Кроме того, при одновременном выполнении этого кода из двух разных сеансов возникнет ошибка.
При использовании этой функции будет получено уникальное имя, гарантирован доступ к файлу.
Кроме того, при использовании метода ПолучитьИмяВременногоФайла платформа 1С:Предприятие сохраняет контроль над такими файлами и автоматически удаляет их
- при перезапуске рабочего процесса (если файл был создан на стороне сервера) или клиентского приложения (если файл был создан на стороне клиента);
- через 20 минут после серверного вызова или сеанса, в котором создан временный файл (при работе в клиент-серверном варианте на платформе 8.3.17 и больше).
Если же имя временного файла было сформировано каким-то другим способом, и прикладной код не удалил (либо по какой-то причине не смог удалить) ранее созданный временный файл, то платформа такой файл не контролирует, и он остается в файловой системе на неопределенное время. Накапливание «потерянных» временных файлов может представлять серьезную проблему, особенно для информационных баз с большим количеством активно работающих пользователей (например, при работе в режиме сервиса).
Таким образом, неправильно :
Каталог = КаталогВременныхФайлов();
ИмяФайла = Строка(Новый УникальныйИдентификатор) + ".xml";
ИмяПромежуточногоФайла = Каталог + ИмяФайла;
Данные.Записать(ИмяПромежуточногоФайла);Если по каким-то причинам прикладной код не удалит созданный файл (например, между блоками создания и удаления временного файла возникнет штатное или нештатное исключение), этот файл так и останется в каталоге временных файлов.
При использовании метода ПолучитьИмяВременногоФайла будет получено уникальное имя, гарантирован доступ к файлу, а также временный файл будет автоматически удален платформой 1С:Предприятие после завершения рабочего процесса сервера или клиентского приложения.
2. Для создания временного каталога рекомендуется также использовать имя, полученное при помощи метода ПолучитьИмяВременногоФайла (исключение составляет веб-клиент, см. ниже п. 3). Это гарантирует уникальность имени создаваемого каталога при работе в многопользовательском режиме и гарантирует, что после перезапуска рабочего процесса или клиентского приложения временный каталог будет автоматически удален платформой 1С:Предприятие. После этого, внутри созданного каталога можно создавать другие каталоги и файлы без ограничений.
3.1. При выполнении кода веб-клиентом метод ПолучитьИмяВременногоФайла недоступен. Поэтому для формирования имен временных файлов и каталогов необходимо использовать функцию КаталогВременныхФайлов и объект УникальныйИдентификатор .
Каталог = КаталогВременныхФайлов();
ИмяФайла = "TempDataFile.xml";
ИмяПромежуточногоФайла = Каталог + ИмяФайла;
Данные.Записать(ИмяПромежуточногоФайла);Каталог = КаталогВременныхФайлов();
ИмяФайла = Строка(Новый УникальныйИдентификатор) + ".xml";
ИмяПромежуточногоФайла = Каталог + ИмяФайла;
Данные.Записать(ИмяПромежуточногоФайла);3.2. Если в конфигурацию встроена Библиотека стандартных подсистем , для создания временных каталогов на стороне клиента необходимо использовать процедуру ФайловаяСистемаКлиент.СоздатьВременныйКаталог .
4. После окончания работы с временным файлом или каталогом, его необходимо удалить самостоятельно. Нельзя рассчитывать на автоматическое удаление файлов и каталогов при следующем запуске платформы, это может привести к исчерпанию свободного места в каталоге временных файлов.
// Работа с файлом
.// Удаляем временный файл
Попытка
УдалитьФайлы(ИмяПромежуточногоФайла);
Исключение
ЗаписьЖурналаРегистрации(НСтр("ru = 'Мой механизм.Действие'"), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;5. При использовании временных файлов и каталогов на сервере, необходимо полностью завершать работу с ними в рамках одного серверного вызова. При работе конфигурации с использованием кластера серверов, при следующем вызове эти файлы могут стать недоступны, так как код начнет исполняться на другом компьютере. При необходимости сохранить данные между серверными вызовами в пределах одного сеанса следует использовать временное хранилище платформы (методы ПоместитьВоВременноеХранилище , ПолучитьИзВременногоХранилища ).
5.1. В редких случаях может возникнуть необходимость передачи данных во временных файлах между сеансами, например, при подготовке данных для фонового задания, при организации длительного процесса, обслуживающего несколько последовательных вызовов web-сервиса. Необходимо самостоятельно обеспечивать гарантировано общее место хранения, права для доступа к файлам из разных мест их обработки, удаление файлов по истечению сроков их обработки или аварийного завершения процесса обработки. Рекомендуется использовать следующий подход:
- Для обеспечения доступа со всех возможных мест обработки заводится константа для хранения общего пути к файлам, доступного для доступа со всех серверов кластера;
- При создании временных файлов их имена заносятся во вспомогательный регистр сведений с сохранением времени создания файла;
- При штатном прохождении процесса, последняя операция, которой были нужны файлы, перед своим завершением удаляет как сам файл, так и записи о них во вспомогательном регистре;
- Вспомогательное регламентное задание периодически проверяет наличие записей во вспомогательном регистре, время существования которых заведомо превышает время штатного завершения процесса. При обнаружении таких записей, задание удаляет временные файлы и записи о них.
Передача файлов между клиентом и сервером
1. При одновременной работе с файлом на клиенте и на сервере необходимо использовать передачу файла через временное хранилище (методы ПоместитьФайлы , ПолучитьФайл , ПолучитьФайлы , НачатьПомещениеФайла , ПоместитьВоВременноеХранилище , ПолучитьИзВременногоХранилища ). В общем случае клиент и серверы кластера - это разные компьютеры с разной файловой системой, причем доступ к файлам может происходить под разными пользователями ОС с различными правами.
&НаКлиенте
Процедура ОбработатьФайл()
.
ИмяФайла = "C:\Файлы для обработки\Загрузка.xml";
Результат = ПроизвестиОбработкуНаСервере(ИмяФайла);
.Чтение = Новый ЧтениеТекста(ИмяФайла);
.Результат = Чтение.Прочитать();
Возврат Результат;ИмяФайлаДляОбработки = "C:\Файлы для обработки\Загрузка.xml";
ОписаниеОповещения = Новый ОписаниеОповещения(
"ОбработатьФайлЗавершение", ЭтотОбъект);НачатьПомещениеФайла(ОписаниеОповещения,,
ИмяФайлаДляОбработки, Ложь,
УникальныйИдентификатор);&НаКлиенте
Процедура ОбработатьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)Данные = ПолучитьИзВременногоХранилища(Адрес);
ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("txt");
Данные.Записать(ИмяПромежуточногоФайла);Чтение = Новый ЧтениеТекста(ИмяПромежуточногоФайла);
.
Результат = Чтение.Прочитать();
.2. Для сохранения данных во временном хранилище между несколькими серверными вызовами, при помещении его в хранилище необходимо использовать параметр УникальныйИдентификаторФормы метода ПоместитьФайл , передав в него идентификатор текущей формы. Такие значения будут удалены из временного хранилища только при закрытии указанной формы. При этом, при повторном помещении того же файла во временное хранилище, предыдущее значение необходимо удалять вручную. Например:
.
// Первый серверный вызов
ИмяФайлаДляОбработки = "C:\Файлы для обработки\Загрузка.xml";
ОписаниеОповещения = Новый ОписаниеОповещения(
"ОбработатьФайлЗавершение", ЭтотОбъект);НачатьПомещениеФайла(ОписаниеОповещения,,
ИмяФайлаДляОбработки, Ложь,
УникальныйИдентификатор);&НаКлиенте
Процедура ОбработатьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры).
Результат = ПроизвестиНачальнуюОбработкуНаСервере(Адрес);
ПродолжитьОбработкуФайла();
..
// Второй серверный вызов с той же версией файла
Результат = ПроизвестиПромежуточнуюОбработкуНаСервере(Адрес);
.// Третий серверный вызов с новой версией файла
ОписаниеОповещения = Новый ОписаниеОповещения(
"ПродолжитьОбработкуФайлаЗавершение", ЭтотОбъект);НачатьПомещениеФайла(ОписаниеОповещения,,
ИмяФайлаДляОбработки, Ложь,
УникальныйИдентификатор);Процедура ПродолжитьОбработкуФайлаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
При этом во временном хранилище формы останется две копии файлов. Адрес второй копии будет находиться в переменной Адрес , а адрес первой копии будет утерян. Это приводит к затрате дополнительных ресурсов приложения, замедлению работы.
.
// Первый серверный вызов
ИмяФайлаДляОбработки = "C:\Файлы для обработки\Загрузка.xml";ОписаниеОповещения = Новый ОписаниеОповещения(
"ОбработатьФайлЗавершение", ЭтотОбъект);НачатьПомещениеФайла(ОписаниеОповещения,,
ИмяФайлаДляОбработки, Ложь,
УникальныйИдентификатор);
.&НаКлиенте
Процедура ОбработатьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры).
Результат = ПроизвестиНачальнуюОбработкуНаСервере(Адрес);
ПродолжитьОбработкуФайла();
..
// Второй серверный вызов с той же версией файла
Результат = ПроизвестиПромежуточнуюОбработкуНаСервере(Адрес);
.// Третий серверный вызов с новой версией файла
УдалитьИзВременногоХранилища(Адрес);ОписаниеОповещения = Новый ОписаниеОповещения(
"ПродолжитьОбработкуФайлаЗавершение", ЭтотОбъект);НачатьПомещениеФайла(ОписаниеОповещения,,
ИмяФайлаДляОбработки, Ложь,
УникальныйИдентификатор);&НаКлиенте
Процедура ПродолжитьОбработкуФайлаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)3. Если в конфигурацию встроена Библиотека стандартных подсистем для помещения файлов во временное хранилище необходимо использовать процедуры ЗагрузитьФайл и ЗагрузитьФайлы общего модуля ФайловаяСистемаКлиент . Для сохранения данных файла между несколькими серверными вызовами необходимо использовать свойство ИдентификаторФормы параметра ПараметрыЗагрузки :
&НаКлиенте
Процедура ОбработатьФайл()
.
ИмяФайлаДляОбработки = "C:\Файлы для обработки\Загрузка.xml";
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьФайлЗавершение", ЭтотОбъект);ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
ПараметрыЗагрузки.Интерактивно = Ложь;ФайловаяСистемаКлиент.ЗагрузитьФайл(ОписаниеОповещения,
ПараметрыЗагрузки, ИмяФайлаДляОбработки);&НаКлиенте
Процедура ОбработатьФайлЗавершение(ПомещенныйФайл, ДополнительныеПараметры)Читайте также: