[Column(TypeName = "decimal(18,2)")]
это будет работать с первыми миграциями кода, как описано здесь здесь .
Попробуйте это, поскольку это проявляет больше заботы о корректирующихся символах разделителя каталога в пути между targetPath и именем файла:
File targetFile = new File(targetPath, filename);
Попытайтесь создать файл в другом каталоге - например, "C:\" после того, как Вы удостоверились, что у Вас есть доступ для записи к тому каталогу. Если это работает, путь файла является неправильным.
Смотрят на комментарий в Исключении и пытаются варьироваться все элементы по пути файла. Эксперимент. Сделайте выводы.
Вы проверяете, что targetPath является каталогом, или просто что что-то существует с тем именем? (Я знаю, что Вы говорите, что пользователь может скопировать его с операционной системы, но возможно они вводят что-то еще).
targetPath уже заканчивается File.separator?
(Помогло бы, могли ли Вы зарегистрировать и сказать нам, что значение targetPath и имени файла находится на провальном случае)
Попытайтесь добавить некоторый вход для наблюдения точно, что является именем, и соедините файл каналом, пытается создать, гарантировать, что родитель является хорошо каталогом.
, Кроме того, можно также смотреть на Каналы вместо того, чтобы использовать цикл. ;-)
Возможно, проблема состоит в том, что это копирует файл по сети к общему диску? Я думаю, что Java может иметь проблемы при записи файлов с помощью NFS, когда путь - что-то как \mypc\myshared папка.
, Каков путь, где эта проблема происходит?
Вы говорите "для некоторых пользователей" - таким образом, это работает на других? Каково различие здесь, пользователи выполняют различные экземпляры на различных машинах, или действительно ли это - сервер, это обслуживает параллельных пользователей?
, Если бы последний, я сказал бы, это - ошибка параллелизма так или иначе - две проверки потоков пытаются создать файл с WinNTFileSystem.createFileExclusively (Собственный метод) одновременно.
Ни один createNewFile или createFileExclusively синхронизируются, когда я смотрю на источник OpenJDK, таким образом, Вам, вероятно, придется синхронизировать этот блок самим.
Возможно, файл уже существует. Могло иметь место, не ли Ваше разрешение метки времени достаточно хорошо. Поскольку это - IOException, который Вы получаете, это не могла бы быть проблема разрешения (в этом случае, Вы получите SecurityException).
я сначала проверил бы на существование файла прежде, чем попытаться создать файл и попытку зарегистрировать то, что происходит.
Взгляд общедоступная булевская переменная createNewFile () для получения дополнительной информации о методе Вы используете.
Поскольку я не смог воспроизвести ошибку на своей собственной машине или достать машину пользователя, где код перестал работать, я ожидал до сих пор для объявления принятого ответа. Я изменил код на следующее:
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);
}
После этого это работало на пользователя, сообщающего о проблеме.
, Таким образом, это кажется, ответ Alexanders добился цели - хотя я на самом деле использую немного отличающегося конструктора, чем он дал, но в том же направлении.
я все же должен уговорить того пользователя на помощь мне проверяющий, что изменение кода зафиксировало ошибку (вместо него делающий что-то по-другому) путем выполнения старой версии снова и проверки, перестало ли это все еще работать.
вход btw. существовал, и зарегистрированный путь казался хорошо - извините за то, что не было упомянуто это. Я считал это само собой разумеющимся и нашел, что это излишне усложнило код в вопросе.
спасибо за полезные ответы.
Я столкнулся с той же проблемой. Я думаю, это как-то связано с разрешением на запись. У меня возникла ошибка при попытке записи на c: \, но при переходе на D: \ все работало нормально. Очевидно, у Java не было разрешения на запись на мой системный диск (под управлением Windows 7, установленной на C :)