gpt4 book ai didi

java - File.canWrite() 没有按预期工作

转载 作者:行者123 更新时间:2023-11-30 09:59:21 26 4
gpt4 key购买 nike

我在 7 年前发现了同样的问题,但找不到解决方案。

我创建了一个写入权限被拒绝的文件“readonlyfile.txt”。 window 不允许编辑和存储此文件 - 好的 - 预期。 What i do

但是下面的 canWrite() 代码表明这个文件可以被写入。

Path readonlyfile = Paths.get("C:\\temp_\\__readonlyfile.txt"); 
boolean canwrite = false;
try
{ File f = readonlyfile.toFile();
//File f = new File("C:/temp_/__readonlyfile.txt");
//File f = new File("C:\\temp_\\__readonlyfile.txt");
canwrite = f.canWrite();
} catch (Exception e)
{ System.out.println("canWrite()" + e);
}
System.out.println("---canWrite: " + canwrite);
//---canWrite: true
BufferedWriter bw = null;
try
{
bw = Files.newBufferedWriter(readonlyfile);
bw.write("foo");
System.out.println("write() succeeds");

} catch (Exception e)
{ System.out.println("---cannot open: " + e);
//---cannot open: java.nio.file.AccessDeniedException: C:\temp_\__readonlyfile.txt
} finally
{ try { bw.close(); } catch (Exception ee) {}
}

最佳答案

感谢 boot-and-bonnet:Files.isWritable() 比 File.canWrite() 更可靠,但如果文件不存在,则始终返回 false。所以我在 MyFile 类(见下文)中创建了一些代码 'isWritable() 来克服这个问题。测试代码为:

canwrite = MyFile.isWritable(readonlyfile);
System.out.println("canWrite: " + canwrite + " : " + readonlyfile);

canwrite = MyFile.isWritable(notexists);
System.out.println("canWrite: " + canwrite + " : " + notexists);

canwrite = MyFile.isWritable(readonlydir);
System.out.println("canWrite: " + canwrite + " : " + readonlydir);

canwrite = MyFile.isWritable(dir); // existing dir
System.out.println("canWrite: " + canwrite + " : " + dir);

// canWrite: false : C:\temp_\__readonlyfile.txt
// canWrite: true : C:\temp_\~~~notexists.txt
// canWrite: false : C:\temp_\read-only_dir
// canWrite: true : C:\temp_

/**
* Similar to Files.isWritable() - however also works for a non-existing file/directory.
* In this case, the creating of 'path' as a file is simulated to check write access.
* Note: Files.isWritable() mistakenly returns false for a non-existing file.
* @param path The file or directory to be examined
* @return true if the caller has write permission to the existing file/directory or could create this non-existing
* 'path' as a file, false otherwise
*/
public static boolean isWritable(Path path)
{
if (path == null) return false;
try
{
if (!Files.exists(path))
{ try
{ Files.createFile(path); //atomic
try { Files.delete(path); } catch (Exception e) {}
return true;
} catch (AccessDeniedException e)
{ return false;
} catch (Exception e)
{ logger.log(Level.INFO,"Files.createFile({0}): {1}",new Object[] {path,e}); } // let isWritable() decide
}
return Files.isWritable(path); // works fine for an existing directory too, e.g. read-only-dir

} catch (Exception e)
{ logger.log(Level.WARNING,"MyFile.isWritable(): {0}",e.toString());
}
return false;
} //--------- end of isWritable()

关于java - File.canWrite() 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58993500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com