Ошибка: java.io.IOException: дескриптор недействителен
Я пытаюсь переместить файл из одного места в другое. Когда я запускаю.jar через командную строку, он работает нормально, но когда jar был запущен из планировщика робота (с другой учетной записью службы), появляется ошибка ниже.
java.io.IOException: The handle is invalid
at java.io.WinNTFileSystem.canonicalize0(Native Method)
at java.io.WinNTFileSystem.canonicalize(Unknown Source)
at java.io.File.getCanonicalPath(Unknown Source)
at org.apache.commons.io.FileUtils.copyFile(FileUtils.java:1076)
at org.apache.commons.io.FileUtils.copyFile(FileUtils.java:1040)
Метод, который я использую для fileMove ниже
public static Boolean fileMove(File source, String destination) {
LOG.info(destination + File.separator + source.getName());
LOG.info(source.getAbsolutePath());
File dest = new File(destination + File.separator + source.getName());
try {
FileUtils.copyFile(source, dest);
return FileUtils.contentEquals(source, dest) && Files.deleteIfExists(source.toPath());
} catch (IOException e) {
LOG.warn("IO Error Occurred during file Operations", e);
return false;
}
}
LOG.info(destination + File.separator + source.getName())
регистрируется ниже пути //uk001/eucl/Email_Broker_Archive\mime-message--7431406574003289236.eml
(destination = // uk001 / eucl / Email_Broker_Archive, File.separator = '\', source.getName () = mime-message - 7431406574003289236.eml
LOG.info(source.getAbsolutePath())
регистрируется ниже пути
\uk001\eucl\Source\0002\ мим-сообщения - 7431406574003289236.eml
Разрешение R/W существует как для учетной записи службы (cmd и планировщик Robot), так и для приложения, работающего на сервере Windows.
1 ответ
Кажется, это проблема разделителя файлов, который не соответствует разделителю файлов ОС.
//uk001/eucl/Email_Broker_Archive\mime-message--7431406574003289236.eml
Пожалуйста, замените и проверьте, является ли \ проблема. Кроме того, сделайте проверку, если файл существует, прежде чем копировать файл все время.
if (!Files.exists(dest)) {
FileUtils.copyFile(source, dest);
return FileUtils.contentEquals(source, dest) && Files.deleteIfExists(source.toPath());
//Modify the check above accordingly as the file exists check is already done.
}