Как создать временную папку

Перенос системных папок «Temp» на другой раздел или диск

Как создать временную папку

Привет, друзья. На днях что-то стал я подмечать, что моя Windows при проведении определённых операций ведёт себя туговато. Так, как в былые времена, когда она стояла у меня на HDD, а не на SSD. И тут я вспомнил, что какое-то время назад я переназначил расположение системных папок «Temp» на раздел, который находится на HDD.

Я провёл очистку этих папок и вернул им их дефолтное расположение. Ну и, естественно, дела пошли значительно лучше. Вот и решил сделать небольшую заметку об этом нюансе работы с Windows. Итак, системными средствами можно сменить дефолтное расположение папок временных данных «Temp» на иное.

В каких случаях это целесообразно делать? И, собственно, как это делается?

Друзья, возможно, кто не в курсе, что за папки такие, о которых мы будем говорить. Это две системные папки хранения временных данных. Одна из них находится непосредственно в системном каталоге по пути:

C:\Windows\Temp

Другая располагается внутри профиля каждого пользователя по пути:

C:\Users\Имя_пользователя\AppData\Local\Temp

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

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

Что кого может не устраивать при дефолтном расположении папок «Temp»?Самые распространённые случаи, когда может быть целесообразно сменить дефолтное расположение папок «Temp» – это нехватка места на диске С в условиях невозможности увеличения его объёма и оптимизация работы Windows за счёт реализации RAM-диска.

В последнем случае оптимизирующий эффект достигается за счёт реализуемого средствами оперативной памяти виртуального диска, на котором чтение и запись данных происходит с многократно увеличенными скоростями по сравнению с HDD. В моём же частном случае я, наоборот, переместил папки «Temp» с производительного SSD на медленный HDD.

Зачем? Это была временная надобность, когда я исследовал возможности встроенного в Windows 10 гипервизора Hyper-V, который после обновлений 2018 года обзавёлся возможностью установки виртуальных машин в едином процессе загрузки их дистрибутива с серверов Microsoft.

И вот этот дистрибутив с серверов Microsoft безапелляционно загружался как временные файлы в папки «Temp». Это были большие объёмы данных, планировалось исследование возможностей по всем предлагаемым операционным системам в таком вот едином процессе создания виртуальной машины и загрузки её дистрибутива с сети.

Вот тогда, собственно, и стала необходимость в переназначении месторасположения папок «Temp» на раздел винчестера-файлопомойки. Поскольку средствами Hyper-V, как я уже сказал, смена каталога загрузки дистрибутива не предусматривалась.Чтобы перенести папки «Temp» в другое место, прежде на этом месте необходимо создать папку с названием, соответственно, «Temp». В нашем случае местом переноса папок пусть будет диск D. На нём создаём папку «Temp».

Теперь жмём клавиши Win+R. Запускаем свойства системы:

sysdm.cpl

Переключаемся на вкладку «Дополнительно». Внизу кликаем «Переменные среды…».

В верхней части окна переменных сред находятся опции правки путей расположения папки «Temp» в составе пользовательского профиля, т.е. внутри папки «AppData». Нам нужно изменить путь в значениях переменных «TEMP» и «TMP». Кликаем первую переменную – «TEMP», жмём «Изменить».

Меняем исходное значение на путь в нашем случае на диске D – D:\Temp. Жмём «Ок».

Теперь то же самое проделываем с переменной «TMP». Меняем её исходный путь на D:\Temp.

Теперь все временные файлы папки «Temp» в составе пользовательского профиля будут поступать в папку «Temp» на диске D.

Далее смотрим нижнюю часть окна переменных сред. В ней мы будем править путь папки «Temp», находящейся внутри системного каталога «Windows». Точно так же, как и в предыдущем случае, кликаем каждую из сред «TEMP» и «TMP», жмём кнопку «Изменить».

И меняем исходный путь на конечный – D:\Temp.

Готово.

Теперь осталось только перезагрузить Windows.

Чтобы вернуть папки «Temp» на свои места – на диск С в каталоги «Windows» и «AppData», необходимо, соответственно, вернуть исходные значения переменных сред для папок «TEMP» и «TMP». Делается это точно таким же образом, как и задавались наши, пользовательские значения. Кликаем каждую из переменных сред и вводим дефолтное значение для «TEMP» и «TMP» в верхней части окна:

%USERPROFILE%\AppData\Local\Temp

Для «TEMP» и «TMP» в нижней части окна:

%SystemRoot%\TEMP

И перезагружаемся.

Метки к статье: Системные функции

Источник: https://remontcompa.ru/windows/chistka-optimizaciya-tviki/1914-perenos-sistemnyh-papok-temp-na-drugoy-razdel-ili-disk.html

Создание временного каталога в Windows?

Как создать временную папку

каков наилучший способ получить имя каталога temp в Windows? Я вижу, что могу использовать GetTempPath и GetTempFileName для создания временного файла, но есть ли какой-либо эквивалент Linux / BSD mkdtemp функция для создания временного каталога?

c# .net windows temporary-directory

нет, нет эквивалента mkdtemp. Лучший вариант – использовать комбинацию GetTempPath и GetRandomFileName.

вам понадобится код, подобный этому:

public string GetTemporaryDirectory(){ string tempDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); Directory.CreateDirectory(tempDirectory); return tempDirectory;}

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

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

public string GetTemporaryDirectory(){ string tempFolder = Path.GetTempFileName(); File.Delete(tempFolder); Directory.CreateDirectory(tempFolder); return tempFolder;}

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

Мне нравится использовать GetTempPath(), функцию создания GUID, такую как CoCreateGuid () и CreateDirectory ().

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

@Chris. Я тоже был одержим отдаленным риском того, что временный каталог может уже существовать. Дискуссии о случайном и криптографически сильном также не полностью удовлетворяют меня.

мой подход основывается на фундаментальном факте, что O/S не должен позволять 2 вызовам создавать файл для обоих успешных. Немного удивительно, что разработчики .NET решили скрыть функциональность Win32 API для каталогов, что делает это намного проще, потому что он возвращает ошибку при попытке создать каталог во второй раз. Вот что я использую:

[DllImport(@”kernel32.dll”, EntryPoint = “CreateDirectory”, SetLastError = true, CharSet = CharSet.Unicode)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool CreateDirectoryApi ([MarshalAs(UnmanagedType.LPTStr)] string lpPathName, IntPtr lpSecurityAttributes); /// /// Creates the directory if it does not exist. /// /// The directory path. /// Returns false if directory already exists. Exceptions for any other errors /// internal static bool CreateDirectoryIfItDoesNotExist([NotNull] string directoryPath) { if (directoryPath == null) throw new ArgumentNullException(“directoryPath”); // First ensure parent exists, since the WIN Api does not CreateParentFolder(directoryPath); if (!CreateDirectoryApi(directoryPath, lpSecurityAttributes: IntPtr.Zero)) { Win32Exception lastException = new Win32Exception(); const int ERROR_ALREADY_EXISTS = 183; if (lastException.NativeErrorCode == ERROR_ALREADY_EXISTS) return false; throw new System.IO.IOException( “An exception occurred while creating directory'” + directoryPath + “'”.NewLine() + lastException); } return true; }

вы можете решить, стоит ли” стоимость/риск ” неуправляемого кода P/invoke. Большинство бы сказало, что это не так, но по крайней мере теперь у вас есть выбор.

CreateParentFolder () остается в качестве упражнения для студента. Я использую каталог.CreateDirectory(). Будьте осторожны с получением родительского каталога, так как он имеет значение null в корневом каталоге.

GetTempPath это правильный способ сделать это; я не уверен, что вас беспокоит этот метод. Затем вы можете использовать CreateDirectory сделать это.

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

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

string randomlyGeneratedFolderNamePart = Path.GetFileNameWithoutExtension(Path.GetRandomFileName()); string timeRelatedFolderNamePart = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString(); string processRelatedFolderNamePart = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(); string temporaryDirectoryName = Path.Combine( Path.GetTempPath() , timeRelatedFolderNamePart + processRelatedFolderNamePart + randomlyGeneratedFolderNamePart);

Как упоминалось выше, путь.GetTempPath () – один из способов сделать это. Вы также можете позвонить окружающая среда.GetEnvironmentVariable (“TEMP”) Если у пользователя настроена переменная среды TEMP.

Если вы планируете использовать каталог temp в качестве средства сохранения данных в приложении, вам, вероятно, следует посмотреть на использование IsolatedStorage как репозиторий для конфигурации / состояния / etc…

Я обычно использую этот:

/// /// Creates the unique temporary directory. /// /// /// Directory path. /// public string CreateUniqueTempDirectory() { var uniqueTempDir = Path.GetFullPath(Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString())); Directory.CreateDirectory(uniqueTempDir); return uniqueTempDir; }

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

но этой реализации на основе GUID достаточно. У меня нет опыта в подобных делах. Некоторые приложения MS также используют временные каталоги на основе GUID.

Источник: https://askdev.ru/q/sozdanie-vremennogo-kataloga-v-windows-23922/

Перенос папки Temp Windows 7 и для чего нужна папка темп

Как создать временную папку

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

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

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

Этап первый: поиск папок Temp

Подобных файловых хранилищ в ПК может быть несколько, но чаще папок Temp у нас всего две. Одна расположена в папке Windows, а именно: в системном разделе ПК, вторую же можно без труда отыскать в профиле пользователя, включив для этого скрытые отображения папок. Так, в системе Windows 7 необходимо проследовать путем: Диск С: Папка Users – Имя пользователя – AppData – Local

Если по какой-то причине вы не нашли здесь папку Temp, обратитесь за помощью с верному другу «Поиску» и команде «Выполнить». В появившемся окне просто введите команду %TEMP%, и она автоматически откроется перед вашими глазами.

Этап второй: делаем ее более удобной

Если возникла необходимость сделать работу с папками удобнее, то обе Temp с хранящимися в них временными файлами можно объединить в одну или создать совершенно новую в другом удобном для вас месте. Заходите в меню «Пуск», нажимаете на «Компьютер» и открываете настройки системы.

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

В открывшемся окне измените путь к введенным адресам TEMP и TMP на созданную или выбранную папку. Сделать это просто: левой клавишей мыши нажмите на каждую переменную, затем примените функцию «Изменить» и наберите новый путь к папке.

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

Я рекомендую создать папку с именем “Temp” в корне диска “С” и указать ее в качестве TEMP и TMP.

Этап третий: чистка папки Temp без вреда для системы

Если у вас еще возникает вопрос: «А можно ли удалять папку Temp?», спешим вас предупредить, что делать этого категорически нельзя. Зато ее нужно обязательно регулярно очищать, освобождая место для работы на диске.

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

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

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

Теперь рассмотрим второй способ очистки папки Temp, который не уступает первому ни в эффективности, ни в простоте. Так, в ОС Windows 7 вы найдете специальный сервис под названием «Очистка Диска»: он расположен в служебных программах «Пуска» и позволяет удалять те временные файлы, которые не были задействованы системой более недели.

Для этого нужно выполнить несколько несложных действий.

Сначала перейдите: из меню «Пуск» в «Компьютер».

Правой кнопкой мышки выберите системный диск (чаще всего это диск C:\) и отметьте пункт «Свойства».

Далее в возникшей вкладке «Общие» нужно будет нажать на «Очистку диска».

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

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

Напоминаем, что если вы до этого не объединили папки Temp в одну, то располагаются они либо здесь:

C:\Windows\Temp

Издесь: диск C:\Users\Имяучетнойзаписи\AppData\Local\Temp

Есть и иной способ найти папки Temp. Нажмите горячие клавиши «Win+R», откройте окошко «Выполнить», введите команду «%TEMP%» и нажмите Ok. Откроется папка C:\Users\Имя учетной записи\AppData\Local\Temp

Есть и еще один вариант, позволяющий очистить папку Temp.

Заходите в блокнот и пишете там следующую команду: rmdir /s /q %temp% Сохраняете документ под каким-либо названием. Кпримеру clean.bat

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

Теперь временные файлы не будут засорять системный диск “С” и мешать его работе. А мы этого, собственно, и добивались.

: “Компьютерные курсы для начинающих пользователей”.

Радкевич Л.В.

Предлагаю в качестве подарка скачать бесплатную книгу: причины зависаний на ПК, восстановление данных, компьютерная сеть через электропроводку и много других интересных фишек.
Еще больше интересных новостей, а главное общение, решений ваших проблем! Добавляйтесь в телеграм – https://t.me/mycompplus

Понравилась полезная статья? Подпишитесь на RSS и получайте больше нужной информации!

Источник: https://mycompplus.ru/-windows/47-windows-7/1899-anvir-task-manager-.html

file – Как создать временную папку в Java?

Как создать временную папку

Если вы используете JDK 7 с использованием новых файлов.createTempDirectory]1 класс, чтобы создать временный каталог.

Path tempDirWithPrefix = Files.createTempDirectory(prefix);

Перед JDK 7, это должно сделать это:

public static File createTempDirectory() throws IOException{ final File temp; temp = File.createTempFile(“temp”, Long.toString(System.nanoTime())); if(!(temp.delete())) { throw new IOException(“Could not delete temp file: ” + temp.getAbsolutePath()); } if(!(temp.mkdir())) { throw new IOException(“Could not create temp directory: ” + temp.getAbsolutePath()); } return (temp);}

Вы могли бы сделать лучше исключения (исключительной ситуации IOException подкласс) если вы хотите.

GreenGiant

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

File myTempDir = Files.createTempDir();

Это делает именно то, что вы просили в одну линию. Если вы читали документацию здесь Вы'увидите, что предлагаемая адаптация `файл.createTempFile (и”установите и”, “в Реж и”), как правило, представляет угрозу для безопасности.

Jared Rummler

Если вам нужен временный каталог для испытания и вы с помощью JUnit, @правилу вместе с `TemporaryFolder решает вашу проблему:

@Rulepublic TemporaryFolder folder = new TemporaryFolder();

В документации:

правила TemporaryFolder позволяет создавать файлы и папки, которые гарантированно будут удалены после завершения работы метода испытаний (ли пройден или не пройден)

Обновление:

Если вы с помощью JUnit Юпитер (версии 5.1.1 или выше), у вас есть возможность использовать Пионер как JUnit, который от JUnit 5 пакет расширений.

Скопированный от проектную документацию:

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

@Test@ExtendWith(TempDirectory.class)void test(@TempDir Path tempDir) { Path file = tempDir.resolve(“test.txt”); writeFile(file); assertExpectedFileContent(file);}

Подробнее в документации и документация из каталога Temp

Gradle в:

dependencies { testImplementation 'org.junit-pioneer:junit-pioneer:0.1.2'}

Мэйвен:

org.junit-pioneer junit-pioneer 0.1.2 test

Обновление 2:

В @TempDir было добавлено примечание к JUnit в релизе 5.4.0 Юпитер в качестве экспериментальной функции. Пример скопирован с с JUnit 5 руководство пользователя:

@Testvoid writeItemsToFile(@TempDir Path tempDir) throws IOException { Path file = tempDir.resolve(“test.txt”); new ListWriter(file).write(“a”, “b”, “c”); assertEquals(singletonList(“a,b,c”), Files.readAllLines(file));}

matsev

Наивно написал код, чтобы решить эту проблему, страдает от условий гонки, в том числе несколько ответов здесь. Исторически вы могли тщательно думать об условиях гонки и написать его самостоятельно, или вы могли бы использовать сторонние библиотеки, такие как Google'ы гуава (как спина's предполагают ответа.) Или вы могли бы писать глючный код.

Но с JDK 7, есть хорошие новости! Сама стандартная библиотека Java теперь работает должным образом (не-ность решения) этой проблемы. Вы хотите Ява.НИО.файл.Файлы#createTempDirectory(). В документации:

public static Path createTempDirectory(Path dir, String prefix, FileAttribute… attrs) throws IOException

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

подробности о том, как имя каталога построен является зависящим от реализации, и, следовательно, не уточняется. Где можно префикс используется для создания имен-кандидатов.

Это эффективно устраняет ошеломляюще древний баг-репорт на Солнце багтрекер, который попросил просто такая функция.

Это исходный код для гуава библиотека's файлов.createTempDir(). Это'ы не так сложно, как вы думаете:

public static File createTempDir() { File baseDir = new File(System.getProperty(“java.io.tmpdir”)); String baseName = System.

currentTimeMillis() + “-“; for (int counter = 0; counter < TEMP_DIR_ATTEMPTS; counter++) { File tempDir = new File(baseDir, baseName + counter); if (tempDir.

mkdir()) { return tempDir; } } throw new IllegalStateException(“Failed to create directory within ” + TEMP_DIR_ATTEMPTS + ” attempts (tried ” + baseName + “0 to ” + baseName + (TEMP_DIR_ATTEMPTS – 1) + ')');}

По умолчанию:

private static final int TEMP_DIR_ATTEMPTS = 10000;

См. здесь

Не используйте deleteOnExit() даже если вы не удалите его позже.

Гугл 'deleteonexit это зло' для получения дополнительной информации, но суть проблемы:

  1. deleteOnExit() удаление только для нормального завершения работы виртуальной машины, не падает или убив процесс JVM.

  2. `deleteOnExit () только удаляет при завершении работы виртуальной Java – машины, не очень хорошо для длительных серверных процессов, потому что:

  3. Самый злой из всех – deleteOnExit() потребляет памяти для каждой записи временных файлов. Если процесс выполняется в течение месяца, или создает множество временных файлов на короткое время, вы уничтожаете память и не выпускал его до того, как JVM завершает работу.

Joachim Sauer

Как из createTempDirectory на Java 1.7 (префикс, у attrs) и createTempDirectory(реж, префикс, у attrs) входит в `Ява.НИО.файл.Файлы

Пример:Файл tempDir = файлы.createTempDirectory (с”программой” – а).toFile();

Вот что я решил сделать мой собственный код:

/** * Create a new temporary directory.

Use something * {@link #recursiveDelete(File)} to clean this directory up since it isn't * deleted automatically * @return the new directory * @throws IOException if there is an error creating the temporary directory */public static File createTempDir() throws IOException{ final File sysTempDir = new File(System.

getProperty(“java.io.tmpdir”)); File newTempDir; final int maxAttempts = 9; int attemptCount = 0; do { attemptCount++; if(attemptCount > maxAttempts) { throw new IOException( “The highly improbable has occurred! Failed to ” + “create a unique temporary directory after ” + maxAttempts + ” attempts.”); } String dirName = UUID.

randomUUID().toString(); newTempDir = new File(sysTempDir, dirName); } while(newTempDir.exists()); if(newTempDir.mkdirs()) { return newTempDir; } else { throw new IOException( “Failed to create temp dir named ” + newTempDir.

getAbsolutePath()); }} /** * Recursively delete file or directory * @param fileOrDir * the file or dir to delete * @return * true iff all files are successfully deleted */public static boolean recursiveDelete(File fileOrDir){ if(fileOrDir.isDirectory()) { // recursively delete contents for(File innerFile: fileOrDir.listFiles()) { if(!FileUtilities.recursiveDelete(innerFile)) { return false; } } } return fileOrDir.delete();}

Просто для завершения, это код из библиотеки Google гуава. Это не мой код, но я думаю, что это окрестностя, чтобы показать его здесь в этой теме.

/** Maximum loop count when creating temp directories. */ private static final int TEMP_DIR_ATTEMPTS = 10000; /** * Atomically creates a new directory somewhere beneath the system's temporary directory (as * defined by the {@code java.io.tmpdir} system property), and returns its name.

* *

Use this method instead of {@link File#createTempFile(String, String)} when you wish to * create a directory, not a regular file.

A common pitfall is to call {@code createTempFile}, * delete the file and create a directory in its place, but this leads a race condition which can * be exploited to create security vulnerabilities, especially when executable files are to be * written into the directory.

* *

This method assumes that the temporary volume is writable, has free inodes and free blocks, * and that it will not be called thousands of times per second. * * @return the newly-created directory * @throws IllegalStateException if the directory could not be created */ public static File createTempDir() { File baseDir = new File(System.getProperty(“java.io.

tmpdir”)); String baseName = System.currentTimeMillis() + “-“; for (int counter = 0; counter < TEMP_DIR_ATTEMPTS; counter++) { File tempDir = new File(baseDir, baseName + counter); if (tempDir.

mkdir()) { return tempDir; } } throw new IllegalStateException( “Failed to create directory within ” + TEMP_DIR_ATTEMPTS + ” attempts (tried ” + baseName + “0 to ” + baseName + (TEMP_DIR_ATTEMPTS – 1) + ')'); }

Этот код должен достаточно хорошо работать:

public static File createTempDir() { final String baseTempPath = System.getProperty(“java.io.tmpdir”); Random rand = new Random(); int randomInt = 1 + rand.nextInt(); File tempDir = new File(baseTempPath + File.separator + “tempDir” + randomInt); if (tempDir.exists() == false) { tempDir.mkdir(); } tempDir.deleteOnExit(); return tempDir;}

Как обсуждалось в эта радиостанция и его комментарии, вы могли бы назвать tempDir.удалить() первый. Или вы могли бы использовать систему.метод getproperty(“и Ява.Ио.никакое сжатие и”) и создать каталог туда. В любом случае, вы должны помнить, чтобы позвонитьtempDir.deleteOnExit () или файла выиграли'т быть удалены после того, как вы'повторно сделано.
Michael Myers

Как вы можете видеть в других ответов, не стандартный подход возник.Следовательно, вы уже упомянули в Apache Commons, я предлагаю следующий подход с использованием пакета fileutils от Апач Викискладе ИО:

/** * Creates a temporary subdirectory in the standard temporary directory. * This will be automatically deleted upon exit. * * @param prefix * the prefix used to create the directory, completed by a * current timestamp.

Use for instance your application's name * @return the directory */public static File createTempDirectory(String prefix) { final File tmp = new File(FileUtils.getTempDirectory().getAbsolutePath() + “/” + prefix + System.currentTimeMillis()); tmp.mkdir(); Runtime.getRuntime().

addShutdownHook(new Thread() { @Override public void run() { try { FileUtils.deleteDirectory(tmp); } catch (IOException e) { e.printStackTrace(); } } }); return tmp; }

Это является предпочтительным, так как Апач Викискладе библиотеку, которая приходит как ближе к спрашивает, И”Стандарт” и работает с JDK 7 и более старых версий.

Это также возвращает “Старый” в файл экземпляра (которое стрим), и не на “Новый” и путь к экземпляру (который является буферным основе и будет результат JDK7'ы getTemporaryDirectory() метод) -> таким образом, он возвращает то, что большинство людей нужно, когда они хотят создать временную директорию.

Carsten Engelke

У меня такая же проблема, так что это просто еще один ответ для тех, кто заинтересован, и он'ы похож на один из вышеперечисленных:

public static final String tempDir = System.getProperty(“java.io.tmpdir”)+”tmp”+System.nanoTime();static { File f = new File(tempDir); if(!f.exists()) f.mkdir();}

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

Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { //stackless deletion String root = MainWindow.tempDir; Stack dirStack = new Stack(); dirStack.push(root); while(!dirStack.

empty()) { String dir = dirStack.pop(); File f = new File(dir); if(f.listFiles().length==0) f.delete(); else { dirStack.push(dir); for(File ff: f.listFiles()) { if(ff.isFile()) ff.delete(); else if(ff.isDirectory()) dirStack.push(ff.

getPath()); } } } } });

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

До Java 7 вы также можете:

File folder = File.createTempFile(“testFileUtils”, “”); // no suffixfolder.delete();folder.mkdirs();folder.deleteOnExit();

Мне нравится несколько попыток на создание уникального названия, но даже это решение не исключает гонки. Другой процесс может проскользнуть в после испытания для существует () и если(newTempDir.вызов метод mkdirs ()). Я понятия не имею, как полностью сделать это безопасно, не прибегая к машинному коду, который я предполагаю, что'ы похоронен внутри файла.createTempFile().

Используя файл#createTempFileиудалить, чтобы создать уникальное имя для каталога, кажется, ОК. Вы должны добавитьShutdownHook` для удаления каталога (рекурсивно) при завершении работы виртуальной машины.

Источник: https://answer-id.com/ru/50871377

Поделиться:
Нет комментариев

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

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.