【问题标题】:Reading/Writing FileNotFoundException (Access is denied)读/写 FileNotFoundException(访问被拒绝)
【发布时间】:2017-04-27 00:07:20
【问题描述】:

每次我的程序尝试读取或写入文件时,我都会收到以下消息:

[System]: LoadConfig >> Config file is missing or corrupt!
C:\Users\Cardinal System\AppData\Roaming\OrlowBase\Run.config (Access is denied)

我在互联网上查到了这个,遇到这个问题的每个人都只是试图读取一个目录,这与写入文件的方式相同。我仔细检查了所有内容,但它继续throwexception。 我尝试以管理员身份运行该程序,但没有做任何事情:/

如果您查看我的代码,您会发现我正在记录所有内容。我将提供我的日志副本。

这是我的阅读方式:

public static ArrayList<String> readConfig(){

    ArrayList<String> list = new ArrayList<String>();

    try {
        Scanner sc = new Scanner(searchForConfig(baseDir));
        //searchForConfig(baseDir) always will return a file.

        while(sc.hasNextLine()){
            list.add(sc.nextLine());
        }

        sc.close();

        return list;
    } catch (FileNotFoundException e) {
        Logger.addElement("[System]: LoadConfig >> Config file is missing or corrupt!");
        Logger.addElement(e.getMessage());
    }

    list.add("Nothing");

    return list;
}

我的写法如下:

public static boolean createNewFile(String Name, String Path, ArrayList<String> Content, boolean override){

    File file2 = new File(Path + dash + Name);

    if(override == false & file2.exists()){

        Name += "1";

    }else{
        if(override == true & file2.exists()){
            file2.delete();
        }
    }

    if(!(Name.indexOf(".") > 0)){
        Name += ".cardinal";
    }

    File file = new File(Path);
    if(!file.isDirectory() | !file.exists()){
        Logger.addElement("[FileWriter]: NewFile >> New file path is invalid.");
        Logger.addElement("[FileWriter]: NewFile >> Creating dirs at path.");
        file.mkdirs();
    }


    try {

        PrintWriter pw = new PrintWriter(Path + dash + Name, "UTF-8");

        for(int i = 0; i < Content.size(); i++){
            pw.println(Content.get(i));
        }
        Logger.addElement("[FileWriter]: NewFile >> Creating file " + Name + " at " + Path + dash);
        pw.close();
        return true;

    } catch (FileNotFoundException e) {
        Logger.addElement("[FileWriter]: NewFile >> FileNotFoundException.");
        Logger.addElement(e.getMessage());
        return false;
    } catch (UnsupportedEncodingException e) {
        Logger.addElement("[FileWriter]: NewFile >> UnsupportedEncodingException.");
        Logger.addElement(e.getMessage());
        return false;
    }
}

更新: 我将记录器更改为记录stacktraces 并获得了更多信息。有点冗长,但一切都在那里:

[System]: Config >> Searching for config in base directory...
[System]: LoadConfig >> Config file is missing or corrupt!
java.io.FileNotFoundException: C:\Users\Cardinal System\AppData\Roaming\OrlowBase\Run.config (Access is denied)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.util.Scanner.<init>(Unknown Source)
    at com.orlow.base.FileSystem.Config.LoadConfig.readConfig(LoadConfig.java:21)
    at com.orlow.base.FileSystem.Config.Config.<clinit>(Config.java:9)
    at com.orlow.base.Init.Init.preInit(Init.java:20)
    at com.orlow.base.Main.main(Main.java:10)
[System]: Config >> Searching for config in base directory...
[System]: LoadConfig >> Config file is missing or corrupt!
java.io.FileNotFoundException: C:\Users\Cardinal System\AppData\Roaming\OrlowBase\Run.config (Access is denied)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.util.Scanner.<init>(Unknown Source)
    at com.orlow.base.FileSystem.Config.LoadConfig.readConfig(LoadConfig.java:21)
    at com.orlow.base.FileSystem.Config.Config.checkConfig(Config.java:13)
    at com.orlow.base.Init.Init.preInit(Init.java:20)
    at com.orlow.base.Main.main(Main.java:10)
[preInit]: Logger >> Starting logger...
[preInit]: Tests >> Testing config...
[System]: Config >> Searching for config in base directory...
[System]: LoadConfig >> Config file is missing or corrupt!
java.io.FileNotFoundException: C:\Users\Cardinal System\AppData\Roaming\OrlowBase\Run.config (Access is denied)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.util.Scanner.<init>(Unknown Source)
    at com.orlow.base.FileSystem.Config.LoadConfig.readConfig(LoadConfig.java:21)
    at com.orlow.base.Init.Init.preTests(Init.java:62)
    at com.orlow.base.Init.Init.preInit(Init.java:22)
    at com.orlow.base.Main.main(Main.java:10)
[preInit]: Config >> Config file is corrupt.
[System]: SaveConfig >> Replacing Config file...
java.io.FileNotFoundException: C:\Users\Cardinal System\AppData\Roaming\OrlowBase\Run.config (Access is denied)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.PrintWriter.<init>(Unknown Source)
    at java.io.PrintWriter.<init>(Unknown Source)
    at com.orlow.base.FileSystem.DataStorage.Files.createNewFile(Files.java:98)
    at com.orlow.base.FileSystem.Config.SaveConfig.replaceCorruptConfig(SaveConfig.java:26)
    at com.orlow.base.FileSystem.Config.Config.getConfigMode(Config.java:32)
    at com.orlow.base.FileSystem.Config.Config.getBuildPath(Config.java:77)
    at com.orlow.base.Init.Init.preTests(Init.java:68)
    at com.orlow.base.Init.Init.preInit(Init.java:22)
    at com.orlow.base.Main.main(Main.java:10)
[preInit]: Config >> Config file is corrupt.
[System]: SaveConfig >> Replacing Config file...
java.io.FileNotFoundException: C:\Users\Cardinal System\AppData\Roaming\OrlowBase\Run.config (Access is denied)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.PrintWriter.<init>(Unknown Source)
    at java.io.PrintWriter.<init>(Unknown Source)
    at com.orlow.base.FileSystem.DataStorage.Files.createNewFile(Files.java:98)
    at com.orlow.base.FileSystem.Config.SaveConfig.replaceCorruptConfig(SaveConfig.java:26)
    at com.orlow.base.FileSystem.Config.Config.getConfigMode(Config.java:32)
    at com.orlow.base.Init.Init.preTests(Init.java:74)
    at com.orlow.base.Init.Init.preInit(Init.java:22)
    at com.orlow.base.Main.main(Main.java:10)
[preInit]: Config >> Config file is corrupt.
[System]: SaveConfig >> Replacing Config file...
java.io.FileNotFoundException: C:\Users\Cardinal System\AppData\Roaming\OrlowBase\Run.config (Access is denied)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.PrintWriter.<init>(Unknown Source)
    at java.io.PrintWriter.<init>(Unknown Source)
    at com.orlow.base.FileSystem.DataStorage.Files.createNewFile(Files.java:98)
    at com.orlow.base.FileSystem.Config.SaveConfig.replaceCorruptConfig(SaveConfig.java:26)
    at com.orlow.base.FileSystem.Config.Config.getConfigMode(Config.java:32)
    at com.orlow.base.FileSystem.Config.Config.getLogPath(Config.java:126)
    at com.orlow.base.Init.Init.preTests(Init.java:80)
    at com.orlow.base.Init.Init.preInit(Init.java:22)
    at com.orlow.base.Main.main(Main.java:10)
[preInit]: Config >> Log path is set to C:\Users\Cardinal System\AppData\Roaming\OrlowBase\Logs
[preInit]: Tests >> Config >> Config test was successful.
[preInit] Tests >> Testing file writer...
[FileWriter]: NewFile >> Creating file firstTestFile.cardinal at C:\Users\Cardinal System\AppData\Roaming\OrlowBase\Data\
[FileWriter]: NewFile >> Creating file secondTextFile.cardinal at C:\Users\Cardinal System\AppData\Roaming\OrlowBase\Data\
[FileWriter]: NewFile >> Creating file thirdTestFile.cardinal at C:\Users\Cardinal System\Desktop\Peter\Programming\Java\Eclipse\Workspaces\Main Workspace\TestSkills\
[FileWriter]: NewFile >> Creating file forthTestFile.cardinal at C:\Users\Cardinal System\Desktop\Peter\Programming\Java\Eclipse\Workspaces\Main Workspace\TestSkills\
[preInit] Tests >> File writer test was successful.
[Init]: Console >> Rendering console GUI...
[System]: Console >> Type "?" for help.

【问题讨论】:

  • 可能将&amp; 更改为&amp;&amp;| 更改为||
  • 并将if(!file.isDirectory() | !file.exists()){更改为if(!file.isDirectory() &amp;&amp; !file.exists()){
  • 换句话说调试你的代码
  • 您是否以管理员身份运行。右键单击OrlowBase 文件夹并在安全选项卡中将此文件夹作为写入权限。
  • @RajithPemabandu 我以管理员身份运行该程序,所以这不应该是问题......另外,我希望它可以在我自己以外的计算机上运行,​​因此更改文件夹权限不是选项:/

标签: java java.util.scanner filenotfoundexception access-denied printwriter


【解决方案1】:

检查用户对 Orlowbase 文件夹的权限。 当我拒绝读/写/完全控制权限时,我得到了您显示的异常,当我允许它们时,您的程序运行正常。

【讨论】:

  • 虽然我能够在不更改文件夹权限的情况下解决此问题,但您仍然尽最大努力获得一个好的答案,因此您获得了赏金:)
【解决方案2】:
  • 可能是权限问题。您以什么用户身份运行应用程序? 'Cardinal System' 以外的其他用户?检查对C:\Users\Cardinal System\AppData\Roaming\OrlowBase\* 的读/写访问权限
  • 在捕获 FileNotFoundException 时不要吞下堆栈跟踪。这可能会导致您找到根本原因。

更新: “AppData”是用户特定的文件夹,只能由用户和管理员访问。在此处查看更多信息: Can any user access the %APPDATA% folder

【讨论】:

  • 我以管理员身份运行程序,所以这不应该是问题...另外,我希望它可以在我自己的计算机以外的计算机上运行,​​因此不能更改文件夹权限: / 关于 AppData,Minecraft 是基于 java 的,可以访问 AppData,尽管它缺乏提升的权限
  • 我测试了 createNewFile() 方法,它在我的机器上创建文件时没有错误。你可以分享 searchForConfig() 方法的代码吗?什么是“basedir”路径?您的日志没有此方法的任何 Path/dir 相关信息!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多