Каковы возможные причины java.io.IOException: «Неверный синтаксис имени файла, имени каталога или метки тома» - PullRequest
14 голосов
/ 25 сентября 2008

Я пытаюсь скопировать файл, используя следующий код:

File targetFile = new File(targetPath + File.separator + filename);
...
targetFile.createNewFile();
fileInputStream = new FileInputStream(fileToCopy);
fileOutputStream = new FileOutputStream(targetFile);
byte[] buffer = new byte[64*1024];
int i = 0;
while((i = fileInputStream.read(buffer)) != -1) {
    fileOutputStream.write(buffer, 0, i);
}

Для некоторых пользователей targetFile.createNewFile приводит к этому исключению:

java.io.IOException: The filename, directory name, or volume label syntax is incorrect
    at java.io.WinNTFileSystem.createFileExclusively(Native Method)
    at java.io.File.createNewFile(File.java:850)

Имя файла и имя каталога кажутся правильными. Каталог targetPath даже проверяется на существование перед выполнением кода копирования, а имя файла выглядит следующим образом: AB_timestamp.xml

Пользователь имеет права на запись в targetPath и может без проблем скопировать файл с помощью ОС.

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

Ответы [ 12 ]

5 голосов
/ 25 сентября 2008

Попробуйте сделать это, так как вам нужно больше заботиться о настройке символов разделителя каталогов в пути между targetPath и именем файла:

File targetFile = new File(targetPath, filename);
5 голосов
/ 25 апреля 2010

Я только что столкнулся с той же проблемой. Я думаю, что это связано с разрешением на запись. Я получил ошибку при попытке записи в c: \, но при переходе на D: \ все работало нормально. Очевидно, у Java не было разрешения на запись на мой системный диск (под управлением Windows 7 установлена ​​на C:)

4 голосов
/ 17 февраля 2016

К вашему сведению, я получил, когда в именах моих файлов была метка времени с двоеточиями, т.е. myfile_HH:mm:ss.csv Удаление двоеточий устранило проблему.

2 голосов
/ 07 февраля 2011

Вот тестовая программа, которую я использую

import java.io.File;
public class TestWrite {

    public static void main(String[] args) {
        if (args.length!=1) {
            throw new IllegalArgumentException("Expected 1 argument: dir for tmp file");
        }
        try  {
            File.createTempFile("bla",".tmp",new File(args[0]));
        } catch (Exception e) {
            System.out.println("exception:"+e);
            e.printStackTrace();
        }
    }
}
1 голос
/ 25 сентября 2008

Попробуйте создать файл в другом каталоге - например, «C: \» после того, как вы убедились, что у вас есть права на запись в этот каталог. Если это работает, путь к файлу неверен.

Посмотрите на комментарий в Исключении и попробуйте изменить все элементы в пути к файлу. Эксперимент. Делайте выводы.

0 голосов
/ 30 ноября 2012

Очень похожая ошибка: - «... java.io.IOException: неверный синтаксис имени файла, имени каталога или метки тома» был создан в Eclipse для меня, когда в домашней обстановке TOMCAT была обратная косая черта тренировки.

Незначительное редактирование предложено на: - http://www.coderanch.com/t/556633/Tomcat/java-io-IOException-filename-directory исправил это для меня.

0 голосов
/ 15 октября 2008

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

File parentFolder = new File(targetPath);
... do some checks on parentFolder here ...
File targetFile = new File(parentFolder, filename);
targetFile.createNewFile();
fileInputStream = new FileInputStream(fileToCopy);
fileOutputStream = new FileOutputStream(targetFile);
byte[] buffer = new byte[64*1024];
int i = 0;
while((i = fileInputStream.read(buffer)) != -1) {
    fileOutputStream.write(buffer, 0, i);
}

После этого он работал для пользователя, сообщающего о проблеме.

Так что, похоже, ответ Александера сделал свое дело - хотя на самом деле я использую конструктор немного другой, чем он, но в том же духе.

Мне еще нужно уговорить этого пользователя помочь мне проверить, что изменение кода исправило ошибку (вместо того, чтобы он делал что-то по-другому), снова запустив старую версию и проверив, не сработала ли она.

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

Спасибо за полезные ответы.

0 голосов
/ 25 сентября 2008

Возможно, файл уже существует. Это может быть в том случае, если разрешение вашей временной метки недостаточно хорошее. Поскольку это IOException, которое вы получаете, это может не быть проблемой разрешения (в этом случае вы получите SecurityException).

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

Посмотрите на public boolean createNewFile () для получения дополнительной информации о методе, который вы используете.

0 голосов
/ 25 сентября 2008

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

Если последнее, я бы сказал, что это ошибка параллелизма - проверка двух потоков попытается одновременно создать файл с WinNTFileSystem.createFileExclusively (Native Method).

Ни createNewFile, ни createFileExclusively не синхронизируются, когда я смотрю на источник OpenJDK, поэтому вам, возможно, придется синхронизировать этот блок самостоятельно.

0 голосов
/ 25 сентября 2008

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

Кроме того, вы также можете взглянуть на каналы вместо использования цикла. ; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...