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

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

Означает ли это, что текстовый файл "Hello" можно восстановить или текст этого файла заменен.

Надеюсь, что это имеет смысл ...

2 ответа2

2

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

редактор

Некоторые редакторы просто переписывают файл.

Однако многие редакторы создают временный файл, который записывается до завершения, а затем переименовывается для замены старого файла. Это делает операцию сохранения "атомарной", то есть файл обязательно будет содержать либо A) старый контент, либо B) новый контент. Запись файла "на месте" открывает потенциальные возможности для частично записанных файлов или повреждения в случае сбоя в работе части системы (например, при сбое питания или сбое приложения).

Рассмотрим следующий псевдокод / шаги:

# user opens file "myfile.txt"
f = open("myfile.txt", "r")
buffer = f.read()

# user edits file in-memory

# saves file as "myfile.txt"
f = open("_myfile.txt", "w")
f.write(buffer)
f.close()
rename("_myfile.txt", "myfile.txt")

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

Файловая система

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

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

Технология хранения (диск)

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

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

Заключение

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


доказательство

Хотите попробовать сами? Запустите это в Linux:

Создайте файловую систему и смонтируйте ее:

$ truncate -s $(( 10 * 1024 * 1024 )) myfs.ext2
$ mkfs.ext2 ./myfs.ext2
mke2fs 1.42.13 (17-May-2015)
Discarding device blocks: done
Creating filesystem with 10240 1k blocks and 2560 inodes
Filesystem UUID: 42d13441-a9c1-44e1-9310-275c92c60f15
Superblock backups stored on blocks:
        8193

Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done

$ mkdir mnt
$ sudo mount -o loop ./myfs.ext2  ./mnt
$ sudo chown attie: ./mnt

Проверьте заранее, чтобы видеть, находится ли " Hello " в том, что фактически является данными диска (это не так):

$ grep "Hello" myfs.ext2

Напишите « Hello » в myfile.txt в файловой системе:

$ echo "Hello" > ./mnt/myfile.txt
$ sync

Проверьте, есть ли сейчас « Hello » (оно есть):

$ grep "Hello" myfs.ext2
Binary file myfs.ext2 matches
$ cat ./mnt/myfile.txt
Hello

Напишите « Aljoe » в myfile.txt:

$ echo "Aljoe" > ./mnt/myfile.txt
$ sync

Проверьте, есть ли сейчас « Hello » (он все еще "на диске", но не в файле):

$ grep "Hello" myfs.ext2
Binary file myfs.ext2 matches
$ cat ./mnt/myfile.txt
Aljoe

Это будет работать как для простого echo , так и для vim .


Обновить

Я только что попробовал это на Windows (которая менее доступна для меня), и похоже, что и FAT, и NFTS будут повторно использовать выделенное хранилище, в то время как ext2/3/4 выделит новое хранилище.

Кроме того, краткий обзор Notepad++ и Atom показывают , что подход "писать и переименовать" не используется , как я ожидал , - в то время как она используется в таких приложениях, как vim

Я думаю, что более правильный ответ может быть:

  • Если вы используете Windows, то данные, вероятно, будут немедленно перезаписаны.
  • Если вы используете Linux, то данные, вероятно, остаются в постоянном хранилище.

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

-1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .