我是Stackoverflow的新手,一般都是编程论坛的新手,所以如果我没有按预期发布我的问题,请原谅我。)。
我也试过寻找一个小时的答案,但令人惊讶的是找不到任何有用的东西。
我正在编写一个代码,使用inputfilestream将Windows文件移动到另一个文件夹。问题是,当在Windows中打开文件(并且在某些情况下必须是这样)时,打开一个新文件并将其分配给inputfilestream失败:
java.io.FileNotFoundException:C:\ Users \ N \ Desktop \ source \ Doc1.docx(系统找不到指定的文件)
at java.io.FileInputStream.open(Native Method)
在java.io.FileInputStream.init>(未知来源)
因此我发现尝试打开文件流时,我必须确保它已关闭。 但我找不到通过Java代码关闭Windows文件的方法。 我所能找到的只是java.nio.File,它是虚拟的,没有close方法。那怎么办呢? 任何人都可以帮我找到这样一个行动的参考吗?
我的相关代码:
private void moveFileToFolder(File sourceDir, File destDir, Path prevFileName, String newFileName){
InputStream inStream = null;
OutputStream outStream = null;
byte[] buffer = new byte[1024];
int length;
try{
try{ //wait so windows can close file successfully
//(if it was opened as a new file and then closed automatically) before trying to read from it
wait(1000);
}catch(Exception e ){}
File source =new File(sourceDir.getPath() + "\\" + prevFileName);
File dest =new File(destDir.getPath() + "\\" + newFileName);
inStream = new FileInputStream(source);
outStream = new FileOutputStream(dest);
//copy the file content in bytes
while ((length = inStream.read(buffer)) > 0){
outStream.write(buffer, 0, length);
}
inStream.close();
outStream.close();
//delete the original file
source.delete();
if (DEBUG_MODE){
System.out.println("File was copied successfully!");
}
}catch(IOException e){
e.printStackTrace();
}
}
非常感谢! NOA
答案 0 :(得分:1)
如果打开文件,您将无法通过Java关闭它,因为要关闭它,您必须在Java代码中打开它。
您可以做的是创建一个列表并添加所有失败的文件,然后在处理结束时尝试再次处理这些文件。
如果它仍然失败,则用户可能正在使用它,因此提示用户帮助或将其记录到日志文件中以便用户可以获取未处理文件的信息是很有趣的。
答案 1 :(得分:1)
使用java打开关闭并删除窗口文件...
final File file=new File("E:\\features.xlsx");
//open file
if(file.exists())
Runtime.getRuntime().exec("cmd /c start E:\\"+file.getName());
//close and delete a open file
Runtime.getRuntime().exec(
"cmd /c taskkill /f /im excel.exe"); //put "winword.exe" for ms word file
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.currentThread().sleep(2000);
file.delete();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();