Get file names from Resources sub folder

拥有回忆 提交于 2019-12-24 20:52:39

问题


In my Resources folder I have a subfolder for images, I would like to get all the file names of those images from within that folder.

tried several Resources.loadAll methods to afterwards get the .name but without success

was is the right practice to achieve what I'm trying to do here ?


回答1:


Hmm... why not try this.

using System.IO;

Const String path = ""; /file path

private void GetFiles()
{
     string [] files = Directory.GetFiles (path, "*.*");
     foreach (string sourceFile in files)
     {
          string fileName = Path.GetFileName (sourceFile);
          Debug.Log("fileName");
     }
}



回答2:


There is no built-in API to do this because the information is not after you build. You cant' even do this with what's in the accepted answer. That would only work in the Editor. When you build the project, your code will fail.

Here's what to do:

1. Detect when the build button is clicked or when a build is about to happen in the OnPreprocessBuild function.

2. Get all the file names with Directory.GetFiles, serialize it to json and save it to the Resources folder. We use json to make it easier to read individual file name. You don't have to use json. You must exclude the ".meta" extension.

Step 1 and 2 are done in the Editor.

3. After a build or during run-time, you can access the saved file that contains the file names as a TextAsset with Resources.Load<TextAsset>("FileNames") then de-serialize the json from TextAsset.text.


Below is very simplified example. No error handling and that's up to you to implement. The Editor script below saves the file names when you click on the Build button:

[Serializable]
public class FileNameInfo
{
    public string[] fileNames;

    public FileNameInfo(string[] fileNames)
    {
        this.fileNames = fileNames;
    }
}

class PreBuildFileNamesSaver : IPreprocessBuildWithReport
{
    public int callbackOrder { get { return 0; } }
    public void OnPreprocessBuild(UnityEditor.Build.Reporting.BuildReport report)
    {
        //The Resources folder path
        string resourcsPath = Application.dataPath + "/Resources";

        //Get file names except the ".meta" extension
        string[] fileNames = Directory.GetFiles(resourcsPath)
            .Where(x => Path.GetExtension(x) != ".meta").ToArray();

        //Convert the Names to Json to make it easier to access when reading it
        FileNameInfo fileInfo = new FileNameInfo(fileNames);
        string fileInfoJson = JsonUtility.ToJson(fileInfo);

        //Save the json to the Resources folder as "FileNames.txt"
        File.WriteAllText(Application.dataPath + "/Resources/FileNames.txt", fileInfoJson);

        AssetDatabase.Refresh();
    }
}

During run-time, you can retrieve the saved file names with the example below:

//Load as TextAsset
TextAsset fileNamesAsset = Resources.Load<TextAsset>("FileNames");
//De-serialize it
FileNameInfo fileInfoLoaded = JsonUtility.FromJson<FileNameInfo>(fileNamesAsset.text);
//Use data?
foreach (string fName in fileInfoLoaded.fileNames)
{
    Debug.Log(fName);
}


来源:https://stackoverflow.com/questions/52888999/get-file-names-from-resources-sub-folder

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!