Могут ли разные файлы иметь одинаковое имя

Обновлено: 01.07.2024

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

Этот параметр очень полезен, если у вас есть несколько файлов с одинаковыми именами и вы хотите установить только один из них, например, исходя из версии ОС или языка. После завершения процесса установки нужный файл появится в папке установки.

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

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

  1. Перейдите на страницу "Файлы и папки" и выберите папку, в которой вы хотите сохранить окончательный файл.
  2. В этой папке создайте две подпапки. Например: Моя_папка_1 и Моя_папка_2 .
  3. В первую папку My_folder_1 добавьте первый файл Eula.rtf.
  4. Во вторую папку My_folder_2 добавьте второй файл Eula.rtf .
  5. Перейдите в родительскую папку, выберите первую созданную ранее подпапку ( My_folder_1 ) и в контекстном меню выберите параметр "Свойства".
  6. В разделе "Компонент" вкладки "Свойства" установите флажок Установить содержимое папки в родительскую папку.
  7. Выполните вышеуказанный шаг для второй папки.
  8. Перейдите на страницу организации и поместите каждый из двух файлов в отдельный компонент.
  9. Для каждого компонента задайте «Условие установки», исходя из которого вы хотите установить этот файл, как показано в видео ниже.

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

Ниже приведена ссылка на короткое видео, демонстрирующее шаги, описанные в этой статье.

Благодаря коротким именам файлов и жестким ссылкам один файл может иметь несколько имен. (И в целях сегодняшнего обсуждения я рассматриваю полный путь как имя, а не только часть после последней обратной косой черты. Не заставляйте меня возвращать придирчивый угол.) Например, C:\PROGRA~1 и C:\Program Files — два возможных имени для одного и того же каталога благодаря коротким именам. [Опечатка исправлена ​​в 7:15 утра.] Если вы создали жесткие ссылки, вы можете дать одному файлу два совершенно не связанных имени, и эти имена даже не обязательно должны находиться в одном и том же каталоге.

С другой стороны, у вас не может быть двух файлов с одинаковыми именами. Что бы это вообще значило? Какой из них вы получите, если сделаете открытый вызов? Как бы вы открыли другой? Черт возьми, еще до того, как мы дойдем до этого момента: как вообще можно создать два файла с одинаковыми именами? Если вы вызовете CreateFile для создания «второго» файла, он просто откроет существующий!

Вот почему меня сбивает с толку этот вопрос, который задает:

Я видел несколько случаев, когда люди писали свою собственную версию GetLongPathName (обычно потому, что им нужна поддержка NT4) с помощью FindFirstFile. Существуют ли ситуации, когда этот подход вернет неправильный путь? Безопасно ли это на практике, потому что FindFirstFile("foo.bar") всегда будет сначала возвращать точное совпадение, прежде чем возвращать "foo.barbaz"?

В этом вопросе предполагается, что в каталоге могут быть два файла с одинаковым именем: один — это файл «foo.bar»; другой — это файл с длинным именем «foo.barbaz» и коротким именем «foo.bar».

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

  1. Создайте файл «foo.barbaz». Ему присваивается короткое имя «foo.bar».
  2. Создайте файл «foo.bar». При этом создается новый файл с именем «foo.bar», который конфликтует с коротким именем существующего файла «foo.barbaz».

За исключением того, что этого не произойдет. Когда вы выполняете шаг 2, попытка создать файл «foo.bar» просто перезаписывает существующий файл, одним из имен которого является «foo.bar». Результат: Один файл с длинным именем «foo.barbaz» и коротким именем «foo.bar».

Другой сценарий может выглядеть следующим образом:

  1. Создайте файл «foo.bar».
  2. Создайте файл «foo.barbaz». Файловая система автоматически назначает короткое имя «foo.bar».

За исключением того, что это не то, что происходит. На втором этапе файловая система генерирует короткое имя типа «foo~1.bar» специально, чтобы избежать конфликта имен.

Вы можете запустить эти эксперименты самостоятельно из командной строки для подтверждения.Команда «dir /x» пригодится.

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

Почему это происходит, довольно очевидно. Предположим, у меня есть два файла: /var/apples (500 КБ) и /var/apples (10 ГБ). Как удалить только 10 гб? Как вы читаете содержимое того или другого? Мир, в котором имена файлов не являются уникальными идентификаторами, — это мир, в котором я не хочу жить.

Почему нельзя иметь две переменные с одинаковыми именами и разными значениями? Или два человека, которые используют один и тот же физический паспорт? Или почему я не могу находиться в двух разных физических местах одновременно?

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

@RestlessC0bra: Все дело в идентификации. Если две вещи имеют одинаковый идентификатор, как вы можете определить, какую из них вы хотите получить? Вот почему у нас есть паспорта, и мы не только используем наши имена в качестве удостоверений личности (наши имена не уникальны). Конечно, каждый файл может также иметь уникальный числовой идентификатор, но это не очень запоминается для нас («что это был за файл 35723 снова?»).

4 ответа 4

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

Кроме того, все комментарии под вашим вопросом абсолютно верны.

ИЗМЕНИТЬ

Есть разные способы скрыть файлы. Надеюсь, эта ссылка поможет вам.

ПРИМЕЧАНИЕ:

Я предоставляю эту ссылку, потому что пример, который вы предоставили мне в комментариях под этим ответом

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

хм, проблема в том, что если у вас есть 100 файлов .txt? теперь не могли бы вы открыть эти 100 файлов =/.

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

Если у вас есть какой-то «очень важный файл» и файл с таким же названием «для прикрытия», как ОС узнает, какой из них вы хотите открыть? Файлы идентифицируются по имени.

скорее идентифицирует файл. Например, когда вы загружаете что-то дважды, система добавляет к этому номер. Итак, если вы загрузите 50 файлов, каждый файл будет иметь цифру или букву (не уверен) в конце, но это поможет вам идентифицировать файл. вы также можете скрыть файлы, если вам нужно скрыть очень важные вещи ;). По крайней мере, я знаю, что вы можете сделать это на Mac

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

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

Теперь, когда мы знаем, что сохранение уникальных имен жизненно важно, все, что нам нужно, это функция для проверки существования файла для ответа на ваш вопрос, часть 2. Поскольку ОС в основном написаны на C, как лучше всего проверить, существует ли файл на C? ? вопрос о SO должен ответить на это для вас.

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

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

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

5 ответов 5

Рассмотрите соотношение затрат и выгод ваших двух вариантов:

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

Не приведет ли использование более длинных имен к лишнему набору текста? Возможно нет. Мало того, что многие JS IDE автоматически заполняют имена файлов в проекте, это также фрагмент кода, который, вероятно, пишется — максимум — только один раз для каждого файла. Код, который часто печатается, — это классы и функции внутри js-файлов, и они (надеюсь) не конфликтуют.

Какую информацию об ошибке вы получаете при отладке? Если наиболее распространенным отчетом об ошибке является «Ошибка в строке 34 из «, то рассмотрите возможность присвоения им уникальных имен, поскольку получение ошибок только в генераторе.js, а затем попытка угадать по контексту, какой генератор это был, может быть проблемой.

@Bergi Это зависит от браузера (и версии), IDE (если есть), системы регистрации ошибок и так далее.

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

Итак. используйте более описательные имена.

Конечно, иногда необходимо, чтобы несколько файлов имели одинаковое имя [например, на многих серверах index.html ]. Меня раздражают программы, которые затрудняют определение пути, связанного с конкретным файлом.

@kmiyashiro - вероятно, да, но если у вас открыто много файлов, вкладки могут быть уменьшены по размеру (ширине) до такой степени, что вы в основном видите только имена файлов. Затем вам нужно всегда наводить указатель мыши на каждую вкладку и ждать, пока «подсказка» не отобразит полный путь/файл. Если у вас открыто только несколько файлов и только редкий случай дублирования имени, это, вероятно, приемлемо. Но при большом количестве файлов это может сильно раздражать.

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

Однако использование более описательных имен может раздражать. когда вы получаете some_super_long_descriptor_that_needs_more_description.js, чтобы отличить его от some_super_long_descriptor_that_needs_more_cowbell.js

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

Если лучшим описанием файла Javascript в контексте client_scripts > app > player_stats действительно является генератор , его путь должен быть следующим: client_scripts/app/player_stats/generator.js .

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

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

Хорошие имена теперь экономят время на рефакторинг позже или, что еще хуже, на большие ошибки позже.

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

Похоже, этот ответ хорошо подходит к данному конкретному примеру, но не отвечает на общий вопрос.

Это зависит от технологии, с которой вы работаете. Имена должны идентифицировать элементы, а пути должны идентифицировать контекст. Я согласен, что хорошие имена важны, но эй, пути тоже имена. Но с практической точки зрения, если вы используете что-то вроде Javascript, вероятно, лучше оставить более точные имена для конечных элементов. Если вы работаете с инструментами, которые учитывают это, например Python, рекомендуется использовать одно и то же имя с другим путем (модулем, пространством имен). Если вы посмотрите на Java, вы также найдете классы с одинаковыми именами и разными пакетами. Можно пойти еще дальше и сказать, что методы называются действиями в контексте класса, и у нас есть методы с одинаковыми именами в разных классах, которые сами могут называться одинаково, но помещаться в разные пакеты. Дзен Python гласит:

Пространства имен — это отличная идея. Давайте сделаем больше таких!

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

Джон Дженсен

Большинство файловых систем Unix, включая все распространенные системы Linux, полностью чувствительны к регистру, что означает, что в одном каталоге могут находиться два файла, отличающиеся только регистром:

  • очень-красивое-изображение.jpg
  • ОЧЕНЬ-красивое-изображение.jpg

Однако это не так в Windows и Mac OS X. Они сохранят выбранный вами регистр заглавных букв, но каждое имя файла должно быть уникальным независимо от случая.

Я не знаю ситуаций, в которых было бы целесообразно иметь такие конфликтующие файлы смешанного регистра даже в Linux, где это работает нормально. Но по разным причинам это может произойти в грязном реальном мире. Если вы затем отправите эти файлы кому-то на Windows или Mac OS X в виде zip-файла или через систему управления версиями Git, они запутаются.

При распаковке обычно последний извлекаемый файл перезаписывает более ранний с почти таким же именем. Таким образом, файл, который может быть важен, просто таинственным образом исчезнет.

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

Чтобы исправить это, проще всего вернуться к (предположительно) системе Linux, где были созданы конфликтующие файлы, и удалить один из них. Затем на стороне Windows или Mac OS X удалите оба файла (с обычным rm), а затем git pull или, по крайней мере, git checkout . чтобы записать оставшийся файл на диск.

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

Это вариант одного из предложений из обсуждения Stack Exchange, но он изменен, чтобы отображались имена обоих файлов с параметром uniq -D, который есть только в версии uniq GNU. В других версиях есть uniq -d, который почти так же хорош, но показывает только одно из пары имен, дублирующихся не в регистре.

С Новым годом! Надеюсь, вам никогда не понадобятся эти советы. :)

Читайте также: