Re[3]: Два несуществующих файла
От: Vi2 Удмуртия http://www.adem.ru
Дата: 28.09.25 18:15
Оценка:
Здравствуйте, Doom100500, Вы писали:

D>Файл с нулевым размером может существовать, а может не существовать. Два таких файла идентичны?


Конечно, идентичны: "размер одинаковый (ноль), а содержания нет ни одного байта". Мы же не реальное существование файлов ищем — для этого существуют другие функции.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re: Два несуществующих файла
От: · Великобритания  
Дата: 29.09.25 08:14
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Вот если мы сравниваем два нулевых указателя, то получаем true.

BFE>А вот если мы сравниваем два несуществующих файла, то функция их сравнения должна возвращать true или false?
Классика же:
https://thedailywtf.com/articles/Classic-WTF-What-Is-Truth
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Два несуществующих файла
От: B0FEE664  
Дата: 29.09.25 09:16
Оценка:
Здравствуйте, hi_octane, Вы писали:

BFE>>Да ладно! Философия или где?

BFE>>Вот функция: bool AreEqualFiles(string strFilename1, string strFilename2); что должна возвращать?
_>Ну я бы кидал исключение "FileNotFound", потому что это сделает fail early легиону багов "ой, у нас тут путь потерялся", "ой, расширение не добавили", "ой на Linux case matters", и т.д.

Бросить исключение просто, но вот поймать...
Ну и к тому же, отсутствие файла может вовсе не являться исключительной ситуацией, если это так, то исключение бросать — это вести себя странно.
И каждый день — без права на ошибку...
Re[4]: Два несуществующих файла
От: B0FEE664  
Дата: 29.09.25 09:16
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

BFE>>Вот функция: bool AreEqualFiles(string strFilename1, string strFilename2); что должна возвращать?

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

Какие, например?
И каждый день — без права на ошибку...
Re[4]: Два несуществующих файла
От: B0FEE664  
Дата: 29.09.25 09:19
Оценка:
Здравствуйте, Osaka, Вы писали:

O>>>Существование файла — это bool, int, или string[]?

BFE>>А как надо?
O>Очевидно, если файл должен существовать в нескольких местах, а существует во всех/некоторых/ни в одном, — это разные степени не-существования.
O>А какая точность нужна в конкретном случае — для этого нужно знать предметную область.

То есть обобщение сделать невозможно? Тогда хотелось бы примеры случаев, когда функция должна возвращать true для одной ситуации и false для другой.
И каждый день — без права на ошибку...
Re[2]: Два несуществующих файла
От: B0FEE664  
Дата: 29.09.25 09:22
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>И должна она возвращать Identical если одинаковые, Different если разные и NoResult если по каким-то причинам пока невозможно их сравнить

Можете привести пример, когда NoResult должен обрабатываться иначе, чем Different?
И каждый день — без права на ошибку...
Re[4]: Два несуществующих файла
От: B0FEE664  
Дата: 29.09.25 09:28
Оценка:
Здравствуйте, Vi2, Вы писали:

D>>Файл с нулевым размером может существовать, а может не существовать. Два таких файла идентичны?

Vi2>Конечно, идентичны: "размер одинаковый (ноль), а содержания нет ни одного байта". Мы же не реальное существование файлов ищем — для этого существуют другие функции.

Интересная мысль. То есть это как со строкой: иногда пустая строка и NULL строка рассматриваются как равные...
И каждый день — без права на ошибку...
Re[2]: Два несуществующих файла
От: B0FEE664  
Дата: 29.09.25 09:38
Оценка:
Здравствуйте, rg45, Вы писали:

R>Имхо, эта аналогия не совсем корректна. Значения указетелей нулевые, но сами указатели, всё-таки, существуют как объекты. И более корректной аналогией сравнения нулевых указателей было бы сравнение двух пустых файлов.

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

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

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

R>Короче, как сам решишь, так и будет.

Да, так обычно и бывает.
И каждый день — без права на ошибку...
Re[2]: Два несуществующих файла
От: B0FEE664  
Дата: 29.09.25 09:54
Оценка:
Здравствуйте, L_G, Вы писали:

L_G>Если "написать функцию сравнения двух файлов, на входе — 2 имени, на выходе — boolean" — это уже утвержденное/согласованное ТЗ, а стандартные функции получения длины и содержимого файла по его имени бросают исключения, то и функция сравнения должна пробросить эти исключения выше — программист не должен фантазировать, добавлять что-то в ТЗ от себя, да еще и писать лишний код. Об этом же и принцип YAGNI.


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

L_G>Если используемые стандартные файловые функции выдают информацию об ошибках доступа/несуществования файлов/папок как-то иначе — было бы логично следовать их принципу (наша функция вроде бы тоже "файловая") и передавать эту инфу выше (только если это не противоречит ТЗ).


Тоже самое — ситуация неотличима от предыдущего случая: код обработки результата вызова функции дублируется от вызова к вызову.

L_G>Конечно, если есть возможность уточнить ТЗ — лучше это сделать.

Предположим, что вы пишите ТЗ. Какое уточнение вы добавите?

L_G>Если эту задачу поставил себе сам программист — кому как не ему лучше знать ответ. Но в общем случае опять же YAGNI рулит.

Я не следую принципу YAGNI, так как этот принцип ведёт к написанию исключительно ситуативного кода и как следствие к нулевому переиспользованию. Мне просто не интересно писать такой код.
И каждый день — без права на ошибку...
Re[3]: Два несуществующих файла
От: rg45 СССР  
Дата: 29.09.25 10:03
Оценка:
Здравствуйте, B0FEE664, Вы писали:

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


Ну это потому что в твоей постановке задачи отсутсвие файла приравнивается к пустому файлу. А вообще, сказать, какой бы был размер файла, если бы он существовал и каково было бы его содержимое — ну это такой себе вопросик.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 29.09.2025 10:04 rg45 . Предыдущая версия .
Re[2]: Два несуществующих файла
От: B0FEE664  
Дата: 29.09.25 10:09
Оценка:
Здравствуйте, ·, Вы писали:

·>Классика же:

·>https://thedailywtf.com/articles/Classic-WTF-What-Is-Truth

А для этой классики есть классический коан, показывающий необходимость третьего значения?
И каждый день — без права на ошибку...
Re[3]: Два несуществующих файла
От: · Великобритания  
Дата: 29.09.25 10:22
Оценка:
Здравствуйте, B0FEE664, Вы писали:


L_G>>Конечно, если есть возможность уточнить ТЗ — лучше это сделать.

BFE>Предположим, что вы пишите ТЗ. Какое уточнение вы добавите?
Это зависит от задачи. Например, если ты решаешь задачу сделать бэкап, и надо потом убедиться, что AreEqualFiles("orig.file", "backup.file"). — ты уверен, что тут хочешь true, если дискетку достали в неподходящий момент? Тут явно надо написать страшное сообщение, что "целостность бэкапа не подтверждена" и true/false просто не обойтись.
Другое дело чтобы нарисовать diff например, можно предварительно проверить есть ли разница между "file.a" и "file.b", то true/false — достаточно.

В общем, не надо писать такую функцию. А подумать о решаемой задаче получше и на основании этого принять решение о дизайне кода.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 29.09.2025 10:24 · . Предыдущая версия .
Re[3]: Два несуществующих файла
От: · Великобритания  
Дата: 29.09.25 10:37
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>·>Классика же:

BFE>·>https://thedailywtf.com/articles/Classic-WTF-What-Is-Truth
BFE>А для этой классики есть классический коан, показывающий необходимость третьего значения?
Просто подумать о решаемой задаче? Универсальный покрывающий всю логику псевдокод:
var f1 = open("f1");
var f2 = open("f2");
if(f1.error && f2.error) {
  action0;
} else if(f1.error) {
  action1;
} else if(f2.error) {
  action2;
} else if(f1.contents == f2.contents) {
  action3;
} else {
  action4;
}

Получается:
Если в твоей задаче action0==action1==action2==action3, то твоя "AreEqualFiles" может возвращать true.
Если в твоей задаче action0==action1==action2==action4, то твоя "AreEqualFiles" может возвращать false.
Если в твоей задаче только action0==action1==action2, то твоя "AreEqualFiles" может возвращать Error | Bool
А если вообще всё не равно, то вообще вся лесенка if-ов.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Два несуществующих файла
От: kov_serg Россия  
Дата: 29.09.25 10:41
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, kov_serg, Вы писали:


_>>И должна она возвращать Identical если одинаковые, Different если разные и NoResult если по каким-то причинам пока невозможно их сравнить

BFE>Можете привести пример, когда NoResult должен обрабатываться иначе, чем Different?

Когда файлы имеют одинаковую длинну но доступ к одному или к обоим файлам запрещен или ошибки чтения и невозможно вычислить hash за разумное время или без внешнего вмешательства
Отредактировано 29.09.2025 10:47 kov_serg . Предыдущая версия . Еще …
Отредактировано 29.09.2025 10:45 kov_serg . Предыдущая версия .
Отредактировано 29.09.2025 10:44 kov_serg . Предыдущая версия .
Re: Два несуществующих файла
От: Pavel Dvorkin Россия  
Дата: 29.09.25 11:00
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

BFE>Вот если мы сравниваем два нулевых указателя, то получаем true.

BFE>А вот если мы сравниваем два несуществующих файла, то функция их сравнения должна возвращать true или false?

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

Отсюда

1. Два непустых контейнера равны, если они побайтно совпадают.
2. Пустой контейнер (файл длины 0) не равен любому непустому контейнеру (файлу с длиной >0).
3. Два пустых контейнера равны.
4. Отсутствующий контейнер (несуществующий файл) не равен никакому существующему контейнеру (файлу), независимо от длины последнего.
5. Два отсутствующих контейнера равны.

P.S. Если речь идет о файлах NTFS, то этот алгоритм требует уточнения. Необходимо сравнить все именованные потоки в этих файлах, в них должны совпадать имена и содержимое. Обычный GetFileSize(Ex) вернет лишь длину неименованного потока данных в этом файле.
With best regards
Pavel Dvorkin
Re[4]: Два несуществующих файла
От: B0FEE664  
Дата: 29.09.25 11:52
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>>>И должна она возвращать Identical если одинаковые, Different если разные и NoResult если по каким-то причинам пока невозможно их сравнить

BFE>>Можете привести пример, когда NoResult должен обрабатываться иначе, чем Different?

_>Когда файлы имеют одинаковую длинну но доступ к одному или к обоим файлам запрещен или ошибки чтения и невозможно вычислить hash за разумное время или без внешнего вмешательства

Смотрите: если к одному файлу доступ разрешён, а к другому нет — то файлы разные, так как у них разные права доступа.
Смотрите: если доступ к обоим файлам запрещен или же ошибки чтения, то как будет выглядеть их обработка?
И каждый день — без права на ошибку...
Re[4]: Два несуществующих файла
От: B0FEE664  
Дата: 29.09.25 12:02
Оценка:
Здравствуйте, ·, Вы писали:

L_G>>>Конечно, если есть возможность уточнить ТЗ — лучше это сделать.

BFE>>Предположим, что вы пишите ТЗ. Какое уточнение вы добавите?
·>Это зависит от задачи. Например, если ты решаешь задачу сделать бэкап, и надо потом убедиться, что AreEqualFiles("orig.file", "backup.file"). — ты уверен, что тут хочешь true, если дискетку достали в неподходящий момент? Тут явно надо написать страшное сообщение, что "целостность бэкапа не подтверждена" и true/false просто не обойтись.
Ну почему же? Если функция возвращает false, т.е. файлы различны, то надо написать страшное сообщение, что "целостность бэкапа не подтверждена".

·>В общем, не надо писать такую функцию. А подумать о решаемой задаче получше и на основании этого принять решение о дизайне кода.

Может быть, но наверное стоит уточнить:
— всегда можно проверить доступ к файлам до вызова этой функции, но файлы могут исчезнуть в любой момент удалённые другой программой (например)
— обработчик ошибок можно добавить в качестве третьего аргумента функции.

В обоих случаях функция должна что-то вернуть, при том что, обработчик ошибок может обрабатывать ошибочную ситуацию как угодно, но не меняя результат функции.
И каждый день — без права на ошибку...
Re[5]: Два несуществующих файла
От: hi_octane Беларусь  
Дата: 29.09.25 12:07
Оценка: +2
BFE>Бросить исключение просто, но вот поймать...
Если в языке программирования сложно поймать исключения — он не годится для продакшн-разработки Основано на личном опыте и опыте тех дедов, которые эти самые исключения изобрели. Деды от души наработались на языках без исключений, "заплатили за них железную цену", и получили такие же железные аргументы за их нужность.

BFE>Ну и к тому же, отсутствие файла может вовсе не являться исключительной ситуацией, если это так, то исключение бросать — это вести себя странно.

We need to go deeper Вот ты проверил по File.Exists, а при чтении файла сетевой диск целиком отвалился (или флэшку вытащили). Теперь надо решить — этот файл пропал, но раз он пропал то его нет — а мы как раз решили не бросать исключение если файла нет. Или вот такое "файла нет" уже совсем другое, и оно уже настоящая проблема? Нужно ли дать вызывающей стороне понять что проблема не просто в "нет файла", а в том что всего сетевого диска больше нет? А вдруг вызывающей стороне надо отличать таймаут чтения файла от исчезновения сетевого адаптера?

Попытка взять на себя кусочек чужой ответственности всегда плохо заканчивается. Ты не предусмотришь в своей функции всех проблем с тем, что, случается, подсовывают под видом файла. Того что файл есть, но открыть его нельзя из-за прав доступа, и ещё кучи нюансов. И точно также не предусмотришь всех нюансов вызывающей стороны.
Re[4]: Два несуществующих файла
От: B0FEE664  
Дата: 29.09.25 12:12
Оценка:
Здравствуйте, ·, Вы писали:

BFE>>·>Классика же:

BFE>>·>https://thedailywtf.com/articles/Classic-WTF-What-Is-Truth
BFE>>А для этой классики есть классический коан, показывающий необходимость третьего значения?
·>Просто подумать о решаемой задаче?
Просто подумать недостаточно. Было бы хорошо ещё иметь доказательства существования ситуаций, когда третье значение используется.

  Скрытый текст
·>Универсальный покрывающий всю логику псевдокод:
·>
·>var f1 = open("f1");
·>var f2 = open("f2");
·>if(f1.error && f2.error) {
·>  action0;
·>} else if(f1.error) {
·>  action1;
·>} else if(f2.error) {
·>  action2;
·>} else if(f1.contents == f2.contents) {
·>  action3;
·>} else {
·>  action4;
·>}
·>

·>Получается:
·>Если в твоей задаче action0==action1==action2==action3, то твоя "AreEqualFiles" может возвращать true.
·>Если в твоей задаче action0==action1==action2==action4, то твоя "AreEqualFiles" может возвращать false.
·>Если в твоей задаче только action0==action1==action2, то твоя "AreEqualFiles" может возвращать Error | Bool
·>А если вообще всё не равно, то вообще вся лесенка if-ов.

Ну вот я и спрашиваю, есть ли такие задачи, где action4 отличается от action0,1,2 ?
И каждый день — без права на ошибку...
Re[5]: Два несуществующих файла
От: kov_serg Россия  
Дата: 29.09.25 12:16
Оценка:
Здравствуйте, B0FEE664, Вы писали:

_>>Когда файлы имеют одинаковую длинну но доступ к одному или к обоим файлам запрещен или ошибки чтения и невозможно вычислить hash за разумное время или без внешнего вмешательства

BFE>Смотрите: если к одному файлу доступ разрешён, а к другому нет — то файлы разные, так как у них разные права доступа.
Нет. Файлы могут быть одинаковые и разные. Но это пока невозможно определить => данный вопрос должен быть отложен до решения проблем с доступом.

BFE>Смотрите: если доступ к обоим файлам запрещен или же ошибки чтения, то как будет выглядеть их обработка?

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