Когда компьютер редактирует файл, он удаляет исходный файл?

55

Если code.txt(или любой другой файл) отредактировать и сохранить, у меня есть две идеи о том, как ПК будет обрабатывать процесс:

  1. ПК code.txtполностью удаляет и делает новую code.txt(отредактированную версию) с нуля.

  2. ПК редактирует часть гекса code.txt. Таким образом, удаление не происходит.

Какая идея представляет, как работают компьютеры?

Рабочий человек
источник
Приветствую! Работая с превосходным ответом, предоставленным пользователем Grawity, вот несколько уточняющих вопросов:
18
@HaakonDahl какие уточняющие вопросы? Вы ничего не опубликовали.
Великая утка
Dangit. Придется подождать, пока я не вернусь на свой компьютер. Но суть в том, какой уровень - аппаратное обеспечение, файловая система, ОС или приложение? А какое приложение?
Почему это важно для вас? Даже программы, которые создают «новый» файл, вероятно, изменят время создания так, чтобы оно совпадало с оригиналом. Единственным видимым отличием может быть номер инода (или эквивалентная концепция), который может иметь значение (например, если у вас есть жесткие ссылки, они будут «не синхронизированы»).
Бакуриу
1
Голосование, чтобы закрыть этот вопрос как слишком широкий. Все зависит от операционной системы, программного обеспечения и возможностей основной файловой системы.
JakeGould

Ответы:

121

Может быть либо - это зависит от используемого текстового редактора.

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

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

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

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


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

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

В некоторых файловых системах (таких как Btrfs или ext4) это дополнительная функция; в других (например, файловые системы с лог-структурой) это является частью структуры ядра.

оборота гравитация
источник
30
Это не только на уровне файловой системы. Флэш-память, например, должна очистить блок, прежде чем она сможет записать в него. Таким образом, на практике он часто будет записывать в файлы, просто записывая новое изменение в новый блок и аннулируя его в старом блоке. Благодаря тому, что подобные вещи автоматически обрабатываются самим устройством, ОС может просто использовать обычную файловую систему жесткого диска.
trlkly
7
@trlkly: Все современные устройства флэш-памяти разделены на области стирания, которые на несколько порядков больше, чем сектор диска, и не могут перерабатывать какую-либо часть такой области, не стирая ее все. Следовательно, если область содержит 32 устаревших сектора данных и 224 сектора полезных данных, ему придется скопировать 224 сектора полезных данных в другое место, прежде чем он сможет освободить пространство из любого из устаревших секторов. Современные операционные системы используют команду «trim» для указания секторов диска, содержимое которых можно оставить, если блок, на котором они находятся, будет переработан.
суперкат
Некоторые редакторы во время выполнения выбирают, какое поведение использовать (например, в зависимости от того, есть ли у файла только одна запись в каталоге с именем или несколько).
Тоби Спейт
2
Многие редакторы просто читают файл в память и вносят в него все изменения. (Возможно, с периодическим автоматическим сохранением копии текущей работы в другую.) Исходный файл не изменяется вообще, пока вы не сохраните изменения, например, с помощью команды vi's: w.
jamesqf
4
@jamesqf: Ну, вопрос был о том, что происходит, когда файл «редактируется и сохраняется » ...
grawity
6

Поскольку вы говорите о «сохранении файла», то файл не будет редактироваться на месте на диске.

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

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

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

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

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

Итак, ваша теория 1 близка к тому, что делает большинство редакторов.


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

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

Хайд
источник
1
«Поскольку вы говорите о« сохранении файла », файл не будет редактироваться на месте». - Я думаю, что каждый раз, когда вы «открываете» файл, редактируете его и записываете изменения обратно на диск, вы «сохраняете файл», независимо от того, «записан ли файл» (перезаписан) или старый файл удаляется или переименовывается и создается новый файл. В любом случае, вы обычно в какой-то момент решаете «сохранить изменения» или «отменить изменения».
Кевин Феган
@KevinFegan Ну, вы можете открыть файл в подходящем дисковом или шестнадцатеричном редакторе, отредактировать содержимое и сохранить изменения . Или вы можете открыть файл базы данных (например, файл базы данных SQLite), изменить базу данных и внести изменения в файл. Поэтому открытие файла для изменения может означать его изменение на месте, но «сохранение файла» обычно подразумевает создание нового файла, и эти другие альтернативы имеют другое имя для сохранения изменений.
Хайд
4

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

Однако по прошествии столетия мы перешли на LBA, поэтому теперь ОС будет просто ссылаться на «логический» блок, который она хочет прочитать или записать. У самого жесткого диска теперь был интеллект, чтобы перетасовывать данные за спиной ОС, не замечая этого. Это означало повышение надежности, поскольку сектора, которые не удалось проверить, можно было просто переместить в новое физическое местоположение, не влияя на знание операционной системы о том, где находятся эти данные.

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

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

На уровне приложения вы обычно открываете файл в режиме «ЗАПИСЬ», который сообщает ОС очистить файл («удалить» содержимое, но не сам файл), а затем записать новые данные. Все это буферизируется на уровне ОС, затем «сбрасывается» на диск, что вносит запрошенные изменения.

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

Ага. Это сложно, и очень зависит от производителя / OS-разработчика / приложения-разработчика. Однако вся эта сложность направлена ​​на то, чтобы сделать хранение данных более надежным при одновременном улучшении энергопотребления / времени автономной работы.

phyrfox
источник
3

Зависит. AFAIK Microsoft Word, при сохранении .doc(не .docx) файлов с включенными параметрами быстрого сохранения , добавляет изменения, внесенные в документ с момента последнего сохранения, в существующий файл.

Милет
источник
1

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

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

гигаджоули
источник
2
Я думаю, что вы, возможно, путаете «память» с понятием операций отсоединения файловой системы. И это на самом деле не имеет ничего общего с заданным вопросом, который спрашивает, перезаписаны ли конкретные файлы или есть какое-то n-way обновление.
Что ж, если программное обеспечение было разработано специально для этого, то это возможно, хотя, насколько я знаю, это, как правило, как долгосрочное хранение, так и оперативная память.
GigaJoules
К сожалению, ваше объяснение (насколько я могу расшифровать то, что вы имеете в виду) определенно не о том, как работает «долговременное хранение и оперативная память». Но, в конце концов, это не имеет ничего общего с рассматриваемым вопросом. Который, я повторяю, спрашивает, как программное обеспечение обновляет текстовую информацию в файл на вычислительном устройстве общего назначения с типичной современной файловой системой. Нам не нужно думать, как что-то вроде «памяти» работает или не работает, чтобы ответить на этот вопрос.
1

Надеюсь, это не излишне, немного дополнительной информации / фона.

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

Несколько примеров того, как некоторые приложения могут обрабатывать редактирование:

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

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

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

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

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

Что касается части вашего вопроса о том, что делает «ПК», некоторые операционные системы запоминают каждую версию файла и всегда создают новую. Это довольно редко в наши дни, но я помню старые «мини-компьютеры» (то, что мы теперь называем мэйнфреймами), в конце каждого файла была версия, например, «File.text.1», и она добавлялась к версии каждый раз, когда вы отредактировал это. Такое поведение лучше бы применить к чему-то вроде ленточного накопителя или компакт-диска, где перезапись старой версии была абсолютно непрактичной.

Билл К
источник
1

2 не невозможно, но это глупо по разным причинам.

Хорошо написанный редактор текстовых файлов:

  1. Напишите файл с другим именем и новым содержимым. Если оригинал был myfile.txt, новый может бытьmyfile.txt.new
  2. При условии 1. успешно, переименуйте оригинал в файл резервной копии, скажем myfile.txt~
  3. Переименуйте новый файл в оригинальное имя myfile.txt
  4. Если все прошло успешно, удалите файл резервной копии. Многие редакторы все равно оставляют его, поэтому пользователь может восстановиться, если он / она скоро поймет, что то, что он / она сделал с редактором, было не тем, что он / она хотел сделать.

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

nigel222
источник
Поведение «усекать-на-месте-переписывать» многих текстовых редакторов для операционных систем не IBM / не Microsoft за последние полвека не является «глупым».
JdeBP
1

Краткий ответ

Сильно зависит от вашего редактора, лежащего в основе программного обеспечения / драйверов, хранилища.


Паранойя ответ

Может быть восстановлено, если вы не удалите его навсегда.


Длинный ответ

В вашем вопросе отсутствует информация (программное обеспечение, оборудование и т. Д.), Поэтому вместо того, чтобы отвечать на свои вопросы, я сам помогу вам ответить на ваш вопрос.

Это зависит от нескольких факторов:

  1. Редактор . Если программное обеспечение редактора заменяет блоки одного и того же файла, оно может быть переписано. И это также может зависеть от настроек редактора и типов файлов. Обратите внимание, что слово « май» было выделено курсивом. Даже когда редактор переписывает файл, он все равно может оставаться нетронутым (см. Следующие пункты).

  2. Базовое программное обеспечение / драйверы / файловая система : файл останется нетронутым, если под ним есть другое программное обеспечение / драйверы, которые защищают исходный файл от перезаписи. К таким типам программного обеспечения относятся системы контроля версий, виртуальные дифференциальные диски, некоторые программы резервного копирования. Примером является Git , который сохранит исходные блоки файлов и создаст новый файл, содержащий измененные блоки.

  3. Хранение :

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

    • Существуют способы восстановления данных с обычных механических жестких дисков, даже если они были перезаписаны . И в нем есть специализированные компании.

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


Как убедиться, что удаленный файл действительно удален из хранилища?

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

XX
источник
1

Одно поведение, которое еще никто не упомянул, - это соответствующее поведение некоторых версий операционных систем MS Windows, также связанное с используемой файловой системой.

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

В этом случае действительно не имеет значения, сохраняет ли приложение изменения в файле вашим методом # 1: создание нового файла с тем же именем или вашим методом # 2: редактирование / обновление файла на месте (файл не удаляется). В любом случае, окончательный файл выглядит (почти) во всех отношениях, как исходный файл. Единственное, что он, скорее всего, будет занимать другое физическое дисковое пространство (кластеры / сектора), и запись каталога для файла, вероятно, будет находиться в другом месте.

Как я уже сказал, это поведение некоторых версий MS Windows / файловых систем. Я не знаю, с какой версией Windows и с какой файловой системы это началось, и по-прежнему ли это поведение более поздних версий. Если бы мне пришлось угадывать, я бы сказал, что это было введено в Windows NT и Windows XP и все еще является поведением Windows 10, и (все еще предположение) поведение требует файловой системы Fat32 или NTFS (и, возможно, более новой).

Кевин Феган
источник
На самом деле, это имеет значение, поскольку NTFS поддерживает жесткие ссылки, и одно из известных различий между этими методами заключается в влиянии на многосвязные файлы. Туннелирование файловой системы существует примерно с Windows NT 5.0.
JdeBP
@JdeBP - Да, мы согласны. Вот почему я сказал # 1) «Почти» в «окончательном файле выглядит (почти) во всех отношениях, как исходный файл», и # 2) запись каталога в другом месте.
Кевин Феган
Вы не согласны, если вы, как и вы, утверждаете, что это не имеет значения.
JdeBP