как Windows или Linux решают переименовать / переместить / скопировать файл - PullRequest
0 голосов
/ 19 ноября 2018

Интересно, как Linux и Windows разрешают переименование файла или перемещение файла (перетаскивание) на низком уровне? В Java у нас есть File.move , но я не знаю, как это на самом деле работает?

В Apache Common у нас есть FileUtils.moveFile

Что означает "переместить файл" в linux и windows? Системы помещают в файл памяти при перемещении / переименовании файл, затем создают новый файл и удаляют старый?

1 Ответ

0 голосов
/ 19 ноября 2018

Копирование и переименование - это разные операции.

  • Копирование создает новый файл. Это делается путем копирования байтов 1 ; например откройте файлы и используйте системные вызовы для чтения / записи, чтобы скопировать байты.
  • Rename изменяет путь к существующему файлу. Это делается с помощью системного вызова, который изменяет метаданные для файла и каталогов источника и назначения.

Есть пара морщин.

  • Переименование (в Linux) работает только в файловой системе. Вы не можете переименовать файл в путь в другой файловой системе.

  • В библиотеках Linux / POSIX нет системного вызова "move". Так (например) команда mv в Linux либо переименует файл, либо сделает копию (и удалит оригинал), в зависимости от того, где находятся источник и место назначения.

  • Копирование файла может быть реализовано ленивым способом с использованием копирования при записи. Например, «btrfs» поддерживает копирование при записи, и вполне возможно, что эта функциональность может быть предоставлена ​​приложению.

В приложении Java копирование осуществляется путем копирования байтов файла, а переименование - путем вызова системного вызова переименования, предоставляемого ОС (см. Выше). Глагол перемещения обычно представляет собой гибрид копирования и перемещения, как указано выше.

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


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

...