LibGDX - 搜索文件夹中的文件

时间:2016-03-19 17:53:20

标签: java android libgdx

我有很多资产,很难正确记住文件系统。它非常复杂,一切都无处不在。 我希望能够获得一个文件,即使它不在指定位置但在其中一个子文件夹中。例如,文件位于"data/UI/button.png"而不是"data/button.png"。即使我不知道它在"UI"子文件夹中,我希望能够得到它。

我有一个解决方案。如果您有更好的解决方案,请分享。

这是我的工作解决方案:

public static FileHandle getFile (String fileNameAndDirectory) {
    // search in internal, local, external.
    FileHandle f = Helper.internal(fileNameAndDirectory);
    if (f!=null && f.exists()) {
        return f;
    }
    f = Helper.local(fileNameAndDirectory);
    if (f!=null && f.exists()) {
        return f;
    }
    f = Helper.external(fileNameAndDirectory);
    if (f!=null && f.exists()) {
        return f;
    }
    return null;
}

private static FileHandle internal (String fileNameAndDirectory) {
    // search in the given address. Then look for the subFolders. Recall the function.
    FileHandle f = Gdx.files.internal(fileNameAndDirectory);
    if(f.exists()) return f;
    for (FileHandle fl: f.parent().list()) {
        if (fl.isDirectory()) {
            // call again
            FileHandle tmp = internal(fl.path() + "/" + f.name());
            if (tmp!=null && tmp.exists()) {
                return tmp;
            }
        }
    }
    return null;
}
private static FileHandle local (String fileNameAndDirectory) {
    // search in the given address. Then look for the subFolders. Recall the function.
    FileHandle f = Gdx.files.local(fileNameAndDirectory);
    if(f.exists()) return f;
    for (FileHandle fl: f.parent().list()) {
        if (fl.isDirectory()) {
            // call again
            FileHandle tmp = local(fl.path() + "/" + f.name());
            if (tmp!=null && tmp.exists()) {
                return tmp;
            }
        }
    }
    return null;
}
private static FileHandle external (String fileNameAndDirectory) {
    // search in the given address. Then look for the subFolders. Recall the function.
    FileHandle f = Gdx.files.external(fileNameAndDirectory);
    if(f.exists()) return f;
    for (FileHandle fl: f.parent().list()) {
        if (fl.isDirectory()) {
            // call again
            FileHandle tmp = external(fl.path() + "/" + f.name());
            if (tmp!=null && tmp.exists()) {
                return tmp;
            }
        }
    }
    return null;
}

调用getFile("data/button.png")将获取button.png文件夹或其子文件夹中的第一个"data"。包括“data / UI / button.png”。

问题:

list()中的

FileHandle函数返回桌面版本中的空列表,因为资源位于jar文件中。
但是当我从Android Studio运行时它会起作用,因为游戏在assets文件夹中运行,资产文件不在jar中。

  

注意:Desktop不支持列出内部目录。   https://github.com/libgdx/libgdx/wiki/File-handling

我做了一些搜索:
https://stackoverflow.com/a/12682705/2205307
这个问题不起作用。

我必须使用list()函数才能在子目录中搜索文件。所以我可能会将资产放在桌面构建的外部目录中。除非你有更好的选择。你们会建议什么?

编辑:这是一张帮助我更好地理解文件系统的表格。如果遗漏任何内容,请告诉我。

<html><head><meta content="text/html; charset=UTF-8" http-equiv="content-type"><style type="text/css">ol{margin:0;padding:0}table td,table th{padding:0}.c5{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:126.8pt;border-top-color:#000000;border-bottom-style:solid}.c7{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:106.5pt;border-top-color:#000000;border-bottom-style:solid}.c6{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:113.2pt;border-top-color:#000000;border-bottom-style:solid}.c10{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:108pt;border-top-color:#000000;border-bottom-style:solid}.c2{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:103.5pt;border-top-color:#000000;border-bottom-style:solid}.c1{color:#000000;font-weight:normal;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c0{padding-top:0pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c4{border-spacing:0;border-collapse:collapse;margin-right:auto}.c9{orphans:2;widows:2;height:11pt}.c11{background-color:#efefef;max-width:540pt;padding:36pt 36pt 36pt 36pt}.c3{height:0pt}.c8{font-weight:bold}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style></head><body class="c11"><p class="c9"><span></span></p><a id="t.91cf530bdfdc2ffa8d4c5cfc3ee5db78c585e91d"></a><a id="t.0"></a><table class="c4"><tbody><tr class="c3"><td class="c7" colspan="1" rowspan="1"><p class="c0"><span class="c1">TYPE</span></p></td><td class="c2" colspan="1" rowspan="1"><p class="c0"><span class="c1">Where is it on DESKTOP?</span></p></td><td class="c10" colspan="1" rowspan="1"><p class="c0"><span class="c1">Where is it on ANDROID?</span></p></td><td class="c6" colspan="1" rowspan="1"><p class="c0"><span class="c1">What is it used for?</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c0"><span class="c1">Also includes...</span></p></td></tr><tr class="c3"><td class="c7" colspan="1" rowspan="1"><p class="c0"><span class="c1">classpath</span></p></td><td class="c2" colspan="1" rowspan="1"><p class="c0"><span class="c1">Inside the jar, read only, not for fetching assets</span></p></td><td class="c10" colspan="1" rowspan="1"><p class="c0"><span class="c1">In the src folder, read only, not for fetching assets</span></p></td><td class="c6" colspan="1" rowspan="1"><p class="c0"><span class="c8">All: </span><span class="c1">Not supposed to be used for anything. Maybe to get .class files (But why?)</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c0"><span class="c1">none</span></p></td></tr><tr class="c3"><td class="c7" colspan="1" rowspan="1"><p class="c0"><span class="c1">internal</span></p></td><td class="c2" colspan="1" rowspan="1"><p class="c0"><span class="c1">In the same directory with the jar. Assets are here if not packed within the jar</span></p></td><td class="c10" colspan="1" rowspan="1"><p class="c0"><span class="c1">In the assets folder, read-only</span></p></td><td class="c6" colspan="1" rowspan="1"><p class="c0"><span class="c8">Desktop: </span><span class="c1">Storing assets if not packed within the jar</span></p><p class="c0"><span class="c8">All: </span><span class="c1">Fetching assets</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c0"><span class="c1">Classpath (if a file is not found in the internal storage, which is the case when assets are packed in the jar in Desktop)</span></p></td></tr><tr class="c3"><td class="c7" colspan="1" rowspan="1"><p class="c0"><span class="c1">local</span></p></td><td class="c2" colspan="1" rowspan="1"><p class="c0"><span class="c1">Doesn&#39;t exist, redirected to internal</span></p></td><td class="c10" colspan="1" rowspan="1"><p class="c0"><span class="c1">A private storage to your application, assets are not in here</span></p></td><td class="c6" colspan="1" rowspan="1"><p class="c0"><span class="c8">All: </span><span class="c1">Storing save files, created assets (anything that will be only used by the application)</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c0"><span class="c8">Desktop:</span><span class="c1">&nbsp;Internal but doesn&#39;t include classpath</span></p><p class="c0"><span class="c8">Android: </span><span class="c1">none</span></p></td></tr><tr class="c3"><td class="c7" colspan="1" rowspan="1"><p class="c0"><span class="c1">external</span></p></td><td class="c2" colspan="1" rowspan="1"><p class="c0"><span class="c1">Home directory of the user</span></p></td><td class="c10" colspan="1" rowspan="1"><p class="c0"><span class="c1">A public storage to your application</span></p></td><td class="c6" colspan="1" rowspan="1"><p class="c0"><span class="c8">Desktop: </span><span class="c1">To put the save files in Documents folder</span></p><p class="c0"><span class="c8">All: </span><span class="c1">Store screenshots (so user can access it on gallery application)</span></p></td><td class="c5" colspan="1" rowspan="1"><p class="c0"><span class="c1">none</span></p></td></tr></tbody></table><p class="c9"><span></span></p></body></html>

0 个答案:

没有答案