Такого файла не существует

Обновлено: 07.07.2024

Тем не менее, когда я ls в директории файл указан и он также указан в моем ftp-клиенте. Я попытался создать файл с тем же именем, и я получаю два файла с одинаковым именем.

Я могу открыть файл, который предположительно не существует, но я все еще не могу удалить его. Я также попытался перезагрузить свой сервер. Есть идеи, в чем может быть проблема? Я использую 64-битную версию Ubuntu, но не думаю, что это 32/64-битная проблема. Я должен также отметить, что я удалил много других файлов png, загруженных тем же PHP-скриптом.

Вывод при попытке rm

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

Это означает, что при отсутствии повреждения файловой системы у вас есть два файла с двумя разными именами, которые выглядят одинаково из-за непечатаемых символов или символов, которые выглядят одинаково в вашем наборе символов / шрифте. --escape возможность ls Ваш друг в таких случаях, как и такие инструменты, как cat -v ,

Так тоже есть rm -i -- *

TL;DR: запустить ls -1b найти имя файла, скопировать строку, в которой оно появляется, и дать его rm ,

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

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

Это поведение ls может сбивать с толку, но не является ошибкой, может быть явно переопределено пользователем (см. ниже).

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

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

Это ситуация, когда ls -1b (или же dir -1 ) пригодится:

  • -1 говорит ls показать одну запись в строке. Таким образом, не возникает путаницы в том, где заканчивается одно имя файла и начинается другое. Это удобно для файлов со странными именами.
  • -b говорит ls печатать escape-последовательности для любых специальных символов. Выход из ls -b могут быть скопированы и вставлены буквально в команду, без добавления кавычек: все проблемные символы уже заключены в кавычки таким образом, что оболочка распознает их такими, какие они есть.

Предостережение только одно: если последний символ в строке \ скопируйте один символ после этого, так как это означает \ цитирует пробел.

Вы можете запустить ls -1b просто так, или вы можете передать ему шаблон оболочки (например, ls -1b qyx* ). Globbing может или не может найти файл, в зависимости от того, присутствуют или нет управляющие символы (или другие странные символы) в той части имени, которая появляется в шаблоне glob.

Скопировав \ версия имени файла, данного вам ls Вы можете вставить это в команду. Вам не нужно изменять его вручную каким-либо образом. В вашем случае, если вы хотите удалить файл, введите rm введите пробел, вставьте строку и нажмите Enter .

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

Вступление

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

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

Здесь у нас простая структура:

Там есть file.txt файл и symlink.txt файл. В symlink.txt файл представляет собой символическую ссылку на file.txt .

Проверьте, существует ли файл

Для работы с классом Files вам необходимо ознакомиться с классом Path . Файлы принимает только Путь , а не Файл объекты.

Для целей этого урока мы определим Файл и Путь экземпляр для file.txt в нашем каталоге:

Файлы.существует()

Запуск этого кода даст нам:

Файлы.Не существует()

Возможно, вам будет интересно, почему метод не существует() вообще существует:

Если существует() возвращает истину , это означает, что не существует() должно возвращать ложь . Они логически дополняют друг друга и A = !B , верно?

Ну, вот тут-то многие и ошибаются. Если Files.exists() возвращает false , это не должно означать, что файл не существует.

Это также может означать, что существование файла не может быть проверено . В этом случае оба Files.exists() и Files.notExists() вернут false , поскольку Java не может определить, существует файл или нет.

И если бы мы попытались проверить его существование с помощью:

Нас встретили бы с:

Очевидно, что он существует, но Java не имеет разрешения на подтверждение этого в нашей системе, что приводит к противоречивым результатам.

Файлы.isRegularFile()

Кроме того, мы можем проверить, является ли файл обычным файлом ( false если это каталог) с помощью метода isRegularFile() :

На выходе получается:

Файл.isFile()

Вместо использования класса Files мы также можем выполнять методы для самих файловых объектов:

Файл.существует()

Аналогично предыдущему варианту, мы можем запустить метод exists() :

И это также возвращает:

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

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

Заблокированные Файлы

Забавно отметить, что если вы используете Файл для проверки существования, Java может определить, существует ли заблокированный ранее файл или нет:

Запуск этого фрагмента кода приведет к:

При этом очевидно, что заблокированный файл может быть прочитан с помощью класса File вместо вспомогательного класса Files .

Проверьте, существует ли Каталог

Каталоги-это, по сути, файлы, которые могут содержать другие файлы. Вот почему проверка того, является ли каталог файлом, вернет true . Хотя, если вы проверяете, является ли каталог каталогом (файл особого типа), вы получите более точный результат.

На этот раз мы меняем наше местоположение на:

Файлы.существует()

Опять же, как и в первом примере, мы можем проверить, существует ли он с помощью:

На выходе получается:

Files.isDirectory()

Если бы мы хотели проверить, является ли это конкретным каталогом, мы бы использовали:

И результат таков:

Проверьте, является ли Файл символической ссылкой

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

Давайте переключим наше местоположение на:

Файлы.isSymbolicLink()

Как обычно, класс Files принимает Путь к файлу:

Запуск этого приведет к:

Файл.getCanonicalPath() против файла.getAbsolutePath()

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

Однако здесь это не так. Это связано с тем, что символическая ссылка была создана в Windows с использованием NTFS (Файловая система новой технологии). Символическая ссылка была создана с помощью команды mklink в CMD.

Проверьте, Существует Ли Какой-Либо Из Них

Из предыдущих примеров очевидно, что метод Files.exists() вернет true как для существующих файлов, так и для каталогов. Хотя, это не работает лучше всего, когда дело доходит до заблокированных файлов.

С другой стороны, метод exists() из класса File также вернет true как для файлов, так и для каталогов и сможет прочитать заблокированный файл, который класс Files не может.

Вывод

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

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

После проверки того, существует ли ваш файл или нет, вы, скорее всего, захотите прочитать и записать файлы на Java .

Это ошибка, которую я получаю:
Моя ошибка

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

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

Вот что я пробовал:

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

2 ответа

3 Решение mhlester [2014-02-26 22:33:00]

Проблема заключается в том, как вы используете дату:

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

Вы почти наверняка не хотите создавать каталоги в структуре день/месяц/год, поэтому я предполагаю, что не то, что вы намеревались.

Вы включаете разделители каталогов ( / ) в свое имя файла, и эти каталоги не создаются для вас при попытке открыть файл. Там либо нет 26/ директории или нет 26/02/ каталога в текущем рабочем пути.

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

Что делать? Как я могу получить доступ к содержимому zip-файла?

2 ответа

Вероятно, что filename.zip либо не является файлом .zip , либо поврежден.

Откройте терминал . Вы можете получить к нему доступ, набрав «Терминал» в Spotlight .

Введите команды (ов) в соответствии с приведенными ниже инструкциями в командной строке (три раза щелкните по строке, скопируйте ее и вставьте в приглашение). Замените filename.zip на фактическое имя файла zip .

Если имя файла содержит пробелы, вам нужно ввести его по-другому, используя символ escape . Например, если файл называется compressed crap.zip , вы должны ввести compressed crap.zip в командной строке.

Шаг 1:

Восстановить права доступа к диску. После этого попытайтесь снова открыть ZIP-файл. Если вы хотите, вы можете сделать это из командной строки.

Шаг 2:

Используйте файл , чтобы подтвердить, что это на самом деле zip-файл:

Выход должен быть: Zip archive data, at least v2.0 to extract

Шаг 3:

После подтверждения, что это фактически zip-файл, попробуйте разархивировать прямо из командной строки:

Шаг 4:

Шаг 3, скорее всего, не удастся. Запустите команду zip , чтобы попытаться восстановить повреждение и сохранить содержимое архива (опять же, замените filename.zip на actualname.zip ):

В качестве альтернативы, он может не выйти чисто. Если вам представлена ​​

Is this a single-disk archive? (y/n):

Нажмите клавишу y . После того, как вы вернетесь в приглашение, снова попытайтесь открыть Repairedversion.zip из папки «Загрузки». Если вы все еще не можете его открыть, прокомментируйте это ниже с предупреждением (-ами), полученным от команды. Если вы достигли этого, однако, вероятно, что файл непоправимо поврежден.

Тем не менее, когда я ls в директории файл указан и он также указан в моем ftp-клиенте. Я попытался создать файл с тем же именем, и я получаю два файла с одинаковым именем.

Я могу открыть файл, который предположительно не существует, но я все еще не могу удалить его. Я также попытался перезагрузить свой сервер. Есть идеи, в чем может быть проблема? Я использую 64-битную версию Ubuntu, но не думаю, что это 32/64-битная проблема. Я должен также отметить, что я удалил много других файлов png, загруженных тем же PHP-скриптом.

Вывод при попытке rm

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

Это означает, что при отсутствии повреждения файловой системы у вас есть два файла с двумя разными именами, которые выглядят одинаково из-за непечатаемых символов или символов, которые выглядят одинаково в вашем наборе символов / шрифте. --escape возможность ls Ваш друг в таких случаях, как и такие инструменты, как cat -v ,

Так тоже есть rm -i -- *

TL;DR: запустить ls -1b найти имя файла, скопировать строку, в которой оно появляется, и дать его rm ,

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

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

Это поведение ls может сбивать с толку, но не является ошибкой, может быть явно переопределено пользователем (см. ниже).

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

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

Это ситуация, когда ls -1b (или же dir -1 ) пригодится:

  • -1 говорит ls показать одну запись в строке. Таким образом, не возникает путаницы в том, где заканчивается одно имя файла и начинается другое. Это удобно для файлов со странными именами.
  • -b говорит ls печатать escape-последовательности для любых специальных символов. Выход из ls -b могут быть скопированы и вставлены буквально в команду, без добавления кавычек: все проблемные символы уже заключены в кавычки таким образом, что оболочка распознает их такими, какие они есть.

Предостережение только одно: если последний символ в строке \ скопируйте один символ после этого, так как это означает \ цитирует пробел.

Вы можете запустить ls -1b просто так, или вы можете передать ему шаблон оболочки (например, ls -1b qyx* ). Globbing может или не может найти файл, в зависимости от того, присутствуют или нет управляющие символы (или другие странные символы) в той части имени, которая появляется в шаблоне glob.

Скопировав \ версия имени файла, данного вам ls Вы можете вставить это в команду. Вам не нужно изменять его вручную каким-либо образом. В вашем случае, если вы хотите удалить файл, введите rm введите пробел, вставьте строку и нажмите Enter .

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