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

Обновлено: 02.07.2024

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

В этом кратком руководстве мы рассмотрим, как JUnit 5 упрощает эту проблему, предоставляя расширение TempDirectory.

Подробное руководство по тестированию с помощью JUnit можно найти в нашем превосходном руководстве по JUnit 5.

2. Расширение TempDirectory

Начиная с версии 5.4.2, JUnit 5 предоставляет расширение TempDirectory. Однако важно отметить, что официально это все еще экспериментальная функция, и мы рекомендуем оставить отзыв команде JUnit.

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

Обычно при использовании расширения нам необходимо зарегистрировать его в тесте JUnit 5 с помощью аннотации @ExtendWith. Но в этом нет необходимости с расширением TempDirectory, которое встроено и зарегистрировано по умолчанию.

3. Зависимости Maven

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

Помимо основной библиотеки JUnit 5 junit-jupiter-engine нам также понадобится библиотека junit-jupiter-api:

Как всегда, мы можем получить последнюю версию от Maven Central.

Помимо этого, нам также потребуется добавить зависимость junit-jupiter-params:

Снова мы можем найти последнюю версию в Maven Central.

4. Использование аннотации @TempDir

Чтобы использовать расширение TempDirectory, нам нужно использовать аннотацию @TempDir. Мы можем использовать эту аннотацию только со следующими двумя типами:

На самом деле, если мы попытаемся использовать его с другим типом, будет выдано org.junit.jupiter.api.extension.ParameterResolutionException.

Далее рассмотрим несколько различных способов использования этой аннотации.

4.1. @TempDir в качестве параметра метода

Давайте начнем с того, как внедрить параметр с аннотацией @TempDir в один метод тестирования:

Как мы видим, наш тестовый метод создает и записывает файл с именем numbers.txt во временный каталог tempDir.

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

4.2. @TempDir в поле экземпляра

В следующем примере мы аннотируем поле в нашем тестовом классе с помощью аннотации @TempDir:

На этот раз мы используем java.io.File для нашего временного каталога. Снова пишем несколько строк и проверяем, что они были записаны успешно.

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

4.3. Общий временный каталог

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

Мы можем сделать это, объявив наше поле static:

Ключевым моментом здесь является то, что мы используем статическое поле sharedTempDir, которое мы разделяем между двумя методами тестирования.

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

Мы также задаем порядок тестов с помощью аннотации @Order, чтобы обеспечить неизменное поведение.

5. Подвохи

Теперь давайте рассмотрим некоторые тонкости, о которых следует помнить при работе с расширением TempDirectory.

5.1. Создание

Любознательный читатель, скорее всего, задастся вопросом, где на самом деле создаются эти временные файлы?

Ну, внутренне класс JUnit TemporaryDirectory использует метод Files.createTempDirectory(String prefix). Аналогичным образом, этот метод использует системный каталог временных файлов по умолчанию.

Обычно это указывается в переменной окружения TMPDIR:

Например, в результате получается расположение временного файла:

Между тем, если временный каталог не может быть создан, будет создано ExtensionConfigurationException. Или, как упоминалось ранее, ParameterResolutionException.

5.2. Удаление

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

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

6. Заключение

Подводя итог, в этом руководстве мы изучили расширение TempDirectory, предоставляемое JUnit 5.

Во-первых, мы начали с представления расширения и узнали, какие зависимости Maven нам нужны для его использования. Затем мы рассмотрели несколько примеров использования расширения в наших модульных тестах.

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

Как всегда, полный исходный код статьи доступен на GitHub.

Заразился вирусом через FaceBook. Потратив целый день, я решил отформатировать диск C и выполнить чистую переустановку XP.

Теперь запускается или переустанавливается программа BACK, которую я использовал в течение ЧЕТЫРЕХ лет с XP.

Я получаю сообщение об ошибке:

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

Путь к каталогу действительно существует, и в нем много места. Пробовал программу-эмулятор BACK (окно DOS), но она остается слишком маленькой, меня это не устраивает.

ЛЮБОЕ РУКОВОДСТВО БУДЕТ БОЛЬШЕ ЦЕННО!

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

Похоже, пользовательская переменная среды, которую использует программа, больше не определена. Программе требуется путь к переменной среды для записи некоторых файлов TMP. Если у вас есть пользовательские файлы AutoExec.nt, вы можете извлечь их для одной или нескольких команд SET.

Программа также может иметь дополнительный (INI?) файл. Посмотрите, можете ли вы открыть в Блокноте и проверить пути, которые вы найдете.

Довольно сложно дать более или менее представление о том, что представляет собой программа или в чем она была создана.

Похожие вопросы

исходное название: 16-битная ошибка подсистемы Windows

Вы можете перейти по этой ссылке и проверить, сохраняется ли проблема:

Надеюсь на информацию.

Хорошо, поэтому мне нужен DirectX 0.9 c для игры red alert 3, но я не могу использовать новый DirectX, установленный на моем компьютере, из-за этой ошибки
Файл .cab, необходимый для установки, ненадежен. Убедитесь, что службы криптографии включены и файл сертификата действителен.

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

помощь приветствуется, спасибо

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

  1. Запустите утилиту "Администрирование" на панели управления.
  2. Дважды щелкните Службы.
  3. Нажмите "Службы криптографии", а затем "Свойства".
  4. Нажмите "Автоматически" для параметра "Тип запуска", а затем нажмите "Пуск".

Человек — единственное животное, которое смеется и плачет; потому что это единственное животное, которое поражает различие между тем, что есть на самом деле, и тем, чем оно могло бы быть.

Я не могу инициализировать фотошоп по этой причине, не могу загрузить действия из-за неожиданного конца файла. «Не удалось инициализировать Photoshop, поскольку файл настроек недействителен (удален)». Как решить эту проблему?

У меня MacBook Pro.

Приложение — Adobe Creative Suite 5.5

Единственное приложение, которое не инициализируется, — это Photoshop

Решить проблему

Спасибо, Джеффри Транберри

Оригинальное название: как дефрагментировать диск d

Дефрагментация завершена для: (c :)) некоторые файлы на этом томе не могут быть дефрагментированы. См. в отчете список дефрагментаций этих файлов. Я решаю эту проблему с помощью pagedefrag, но та же проблема с диском D:. Что я могу сделать? это программа дефрагментации диска D: при запуске системы? Помогите пожалуйста :(

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

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

Свойства, производительность, продвижение, файл подкачки, изменить кнопку, выбрать hd, нажать значение "нет файла подкачки"

Введите 2 X, закройте, перезагрузите компьютер. В XP откройте cmd, введите: CLEANMGR, затем выберите hd,

тип: Дефрагментация D: D: фрагментация, однократное выполнение, hd вывод cmd, возврат к системным свойствам, установка

файл подкачки для hd "пусть система управляет", нажми 2 раза игру, закрой, появится пара окон

говорит: 'заменить файл' сказать Да близко. Иногда нужно попробовать несколько, но у вас все получится.

Я исследовал эту проблему буквально по всему Интернету, на форумах, в службе поддержки Dell и по оборудованию Microsoft.

Но вопрос всегда бесплатный!

-Очень хорошо, недавно я скачал 13 бета-версию Garry Mod, и мне захотелось поиграть. Я нажал «Играть», и он сказал:

Необходимо обновить DirectX – введите в Google запрос "DirectX Runtime" 

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

"Установка компонентов: "

Дополнительные компоненты DirectX Runtime.

Внезапно из ниоткуда появляется окно с сообщением:

После нажатия кнопки "ОК" происходит возврат к исходному окну установки с сообщением "Установка не удалась".

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

У меня есть Windows 7 на Alienware M14XR2.

Что-то вам поможет, спасибо!

попробуйте создать другую учетную запись

Это случилось? При попытке загрузить Windows Explorer мои файлы (включая веб-браузеры) были обработаны моим Acrobat Reader. Без понятия, как и почему это произошло. Это также изменило значок для этих файлов (включая браузеры). Не удалось изменить их возвращение. Несколько раз пытался удалить и переустановить Acrobat Reader. После установки Acrobat Reader я не могу открыть свои браузеры или другие измененные файлы. С Acrobat Reader удаленные значки подходят, и я могу открывать браузеры, но другие файлы могут быть открыты не всегда. Что произошло и что я могу сделать, чтобы снова использовать Acrobat Reader, а также использовать свои браузеры и открывать другие файлы?

Вы пытались загрузить проводник Windows?

Я редактировал бесчисленное количество файлов Canon. Файлы RAW CR2 в Photoshop CS6 (v. 13.0 x 64 Extended), который использует плагин Adobe Photoshop Camera Raw (v. 7.1.0.354), для года и регистрации в .JPG. Но сейчас он внезапно перестал работать. При сохранении файла пишет "Не удалось создать файл". Мой компьютер — MacBook Air под управлением OS X Yosemite v. 10.10.5. Ничего о том, кто недавно изменился. Photoshop просто перестал сохранять файлы, которые я редактировал. (Однако файлы XMP не создаются.)

Мне действительно нужно иметь возможность выполнять эту работу. Помогите, пожалуйста. Спасибо!

Что произойдет, если вы сохраните файл в другом месте?

Также для обновления грубой версии камеры до 9.1.1

При настройке операционной системы Windows XP Professional я увидел сообщение об ошибке "Файл\i386\C_437.nls не может быть загружен. Код ошибки – 7. Невозможно продолжить установку. Нажмите любую клавишу для выхода" , может кто-нибудь помочь мне, как я могу решить эту проблему? Спасибо.

Просмотрите статью после устранения неполадок по вашему вопросу:

Надеюсь, это поможет!

Исходное название: Я не могу сохранить отсканированное изображение с помощью своего многофункционального устройства HP Officejet 6210.

Я получаю это сообщение об ошибке: произошла ошибка при сохранении файла, так как его не удалось создать. Что я должен делать? Раньше у меня была возможность сохранять документы в виде файлов .pdf до недавнего времени, когда мой компьютер был заражен вирусом, и кто-то помог удалить удаленно.

При попытке установить стороннее Java-приложение я получил эту ошибку. Не удалось создать временный файл для библиотеки jnidispatch: java.io.IOException: файловая система только для чтения.

Итак, в чем проблема? Вы проверили разрешение файловой системы для вашего пользователя? У него есть временный каталог?

Дорогой Алекс, до этого все работало нормально. Да, там есть временный каталог /tmp. Я пытался удалить файлы, и он продолжает выдавать мне ошибки.

то, что вы являетесь пользователем root, не означает, что у вас есть права на запись в указанный каталог. если у вас есть другие команды, которые не работают из-за отсутствия разрешений, проблема не в JNA.

5 ответов 5

У меня была точно такая же проблема; программа работала нормально несколько месяцев и вдруг эта ошибка. Быстрая отладка с помощью strace показывает, что он пытается открыться:

Естественно, /tmp/jna принадлежал другому пользователю, и в моем случае ему была неделя. Я даже не могу начать объяснять, как программа работала нормально весь день, а потом вдруг вышла из строя, потому что не может писать в этот каталог.

Во всяком случае, я sudo chmod'd /tmp/jna на 777, и теперь все в порядке. Разберись.

Значит, это приложение пытается выполнить запись во временный каталог. Где это ? Это зависит от ОС. Я не знаю, какую ОС вы используете, но вы можете найти местоположение, используя приведенные здесь примеры.

Обратите внимание, что вы можете использовать это системное свойство ( java.io.tmpdir ), чтобы указать новое расположение временного каталога, если вы не можете изменить разрешения того, куда записывает это приложение.

Уважаемый Брайан, я использую Centos и запускаю его как пользователь root. Раньше у меня не было проблем. Когда я удаленно подключаюсь, многие базовые команды Linux, такие как ls-la и т. Д., Также не работают. Я предполагаю, что ОС повреждена, не так ли?

У вас нет прав на запись файла в это место

Дорогой Джигар, я запускаю его как root на Centos, он работает нормально. Проблема рядом с этим, когда я использую winscp, я даже не могу загружать или скачивать какие-либо файлы. Я предполагаю, что моя ОС повреждена, не так ли?

Вероятнее всего, у вас есть другое приложение, использующее тот же каталог, /tmn/jna, таким образом, чтобы изменить его владельца. В моем случае это был Hudson CI.

Вы можете проверить, какое приложение является владельцем файла '/tmp/jna', введя 'ls -l /tmp'.

Chmod /tmp/jna, чтобы предоставить доступ любому (или вашему текущему пользователю), и все вернется в нормальное русло.

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

сбой при создании файла может быть вызван следующими причинами:
1. права пользователя (права на наследование).
2. поврежденный файл.
3. доступ к файлу другим приложением в то же время.
4. файл заблокирован антивирусным/антивредоносным ПО.

странным образом мой антивирус обнаружил файлы adb, avd и jndispatch.dll как нечистые файлы.

Мне пришлось восстановить их из хранилища AVG. настроить AVG для игнорирования (добавления папки в список исключений) требуемой папки.

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

этот же ответ будет относиться к «Ошибка запуска AVD с процессором AMD».
у меня не хватило репутации, чтобы ответить на этот вопрос тут и там.

Это поверх NFS. Вот как выглядит полученный каталог:

Я также могу создать каталог tmp и изменить его на 777:

Текст был успешно обновлен, но возникли следующие ошибки:

joshuacox прокомментировал 29 января 2017 г.

Я добавляю JENKINS_JAVA_OPTIONS в свои переменные среды:

joshuacox прокомментировал 30 января 2017 г.

Хорошо, ситуация ухудшается, у меня есть JENKINS_JAVA_OPTIONS, но я понимаю, что Jenkins не удалось создать временный файл в /tmp .

joshuacox прокомментировал 30 января 2017 г.

Я добавил несколько переменных env безрезультатно (по-прежнему жалуется на /tmp)

прокомментировал carlossg 30 января 2017 г.

joshuacox прокомментировал 30 января 2017 г. •

изменение переменной окружения на JAVA_OPTS приводит к той же ошибке относительно /tmp

выдает ту же ошибку:

учитывая, что это Docker-образ jenkins, разве это не должно быть установлено по умолчанию?

прокомментировал carlossg 30 января 2017 г. •

вы, должно быть, делаете что-то не так, вот оно работает

joshuacox прокомментировал 30 января 2017 г.

вы знаете, я думаю, это потому, что я работал в /tmp в моем Dockerfile, который каким-то образом загрязняет /tmp, я собираюсь изменить все на рабочий каталог и посмотреть, что произойдет, вот мой Dockerfile

joshuacox прокомментировал 30 января 2017 г.

Несмотря на то, что я вставлю пару тревожных моментов, у меня пока работает jenkins, закрываю

добавлен комментарий metaver5o 15 мая 2017 г. •

здесь та же ошибка
$ docker run -ti --name myjenkins -p 8080:8080 -p 50000:50000 myjenkins
15 мая 2017 г., 11:16:19 Main deleteWinstoneTempContents
ВНИМАНИЕ! Не удалось удалить временный файл Winstone /tmp/winstone/jenkins.war

Я пробовал здесь всевозможные chown и chmod, но, к сожалению, это не сработало.
вот мой dockerfile, многие вещи скопированы из репозитория Jenkins CI
если кто-нибудь знает, что это такое, очень признателен товарищам
ура
Марко

ПОЛЬЗОВАТЕЛЬ root
ЗАПУСК mkdir /var/log/jenkins
ЗАПУСК chown -R jenkins:jenkins /var/log/jenkins

ЗАПУСК mkdir -p /var/jenkins_home/

ВЫПОЛНИТЬ chown -R jenkins:jenkins /tmp/
ВЫПОЛНИТЬ chown -R jenkins:jenkins /var/jenkins_home/

КОПИРОВАТЬ plugins.sh /usr/local/bin/plugins.sh
КОПИРОВАТЬ install-plugins.sh /usr/local/bin/install-plugins.sh
КОПИРОВАТЬ jenkins-support /usr/ local/bin/jenkins-support
КОПИРОВАТЬ jenkins.sh /usr/local/bin/jenkins.sh

ЗАПУСК chmod a+rx /usr/local/bin/plugins.sh
ЗАПУСК chmod a+rx /usr/local/bin/install-plugins.sh
ЗАПУСК chmod a+rx /usr /local/bin/jenkins-support
ЗАПУСТИТЬ chmod a+rx /usr/local/bin/jenkins.sh

ENV JAVA_OPTS="-Xmx8192m"
ENV JENKINS_OPTS="--handlerCountStartup=100 --handlerCountMax=300 --logfile=/var/log/jenkins/jenkins.log"

RUN /usr/local/bin/install-plugins.sh \
ant:1.2 \
antisamy-markup formatter:1.1 `
artifactory:2.4.1 \
резервная копия: 1.6.1 \
beaker-builder: 1.8 \
BlameSubversion: 1.200 \
cobertura: 1.9.5

Служебный класс для управления временными файлами. Когда вы создаете объект Tempfile, он создает временный файл с уникальным именем. Объект Tempfile ведет себя точно так же, как объект File, и вы можете выполнять с ним все обычные операции с файлами: чтение данных, запись данных, изменение его разрешений и т. д. Таким образом, хотя этот класс явно не документирует все методы экземпляра, поддерживаемые File, вы можете фактически может вызвать любой метод экземпляра File для объекта Tempfile.

Краткий обзор ¶ ↑

Передовой опыт ¶ ↑

Явное закрытие ¶ ↑

Когда объект Tempfile удаляется сборщиком мусора или когда интерпретатор Ruby завершает работу, связанный с ним временный файл автоматически удаляется. Это означает, что нет необходимости явно удалять временный файл после использования, хотя это рекомендуется делать: не удаляя явно неиспользуемые временные файлы, потенциально можно оставить большое количество временных файлов в файловой системе до тех пор, пока они не будут удалены сборщиком мусора. Существование этих временных файлов может затруднить определение нового имени файла Tempfile.

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

Отключить связь после создания ¶ ↑

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

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

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

Незначительные примечания ¶ ↑

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

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

Методы открытого класса

Создает временный файл как обычный объект File (не Tempfile ). Он не использует финализатор и делегирование.

Если блок не указан, это похоже на Tempfile.new, за исключением создания File вместо Tempfile . Созданный файл не удаляется автоматически. Вы должны использовать File.unlink, чтобы удалить его.

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

В любом случае все аргументы (basename, tmpdir, mode и **options) будут рассматриваться как Tempfile.new.

Создает временный файл с правами доступа 0600 (= только для чтения и записи владельцем) и открывает его в режиме «w+».

Параметр basename используется для определения имени временного файла. Вы можете передать строку или массив с двумя строковыми элементами. В прежней форме базовое имя временного файла будет начинаться с заданной строки. В последней форме базовое имя временного файла будет начинаться с первого элемента массива и заканчиваться вторым элементом. Например:

Временный файл будет помещен в каталог, указанный параметром tmpdir. По умолчанию это Dir.tmpdir. Когда $SAFE > 0 и данный tmpdir испорчен, он использует «/tmp» в качестве временного каталога. Обратите внимание, что значения ENV по умолчанию изменены, а возвращаемое значение Dir.tmpdir может исходить из переменных среды (например, $TMPDIR ).

Вы также можете передать хэш параметров. Под капотом Tempfile создает временный файл, используя File.open . Эти параметры будут переданы в File.open. Это в основном полезно для указания параметров кодирования, например:

Исключения ¶ ↑

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

Если блок не указан, это синоним Tempfile.new .

Если указан блок, то будет создан объект Tempfile, и блок будет запущен с указанным объектом в качестве аргумента. Объект Tempfile будет автоматически закрыт после завершения блока. Вызов возвращает значение блока.

В любом случае все аргументы ( *args ) будут переданы в Tempfile.new .

Методы открытых экземпляров

Закрывает файл. Если unlink_now равно true, то после закрытия файл будет разъединен (удален). Конечно, вы можете отменить связь позже, если не отключите ее сейчас.

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

Закрывает и разъединяет (удаляет) файл. Имеет тот же эффект, что и close(true) .

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