Такого файла не существует
Тем не менее, когда я 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 .
Читайте также: