Jump to content

[SOLVED] Read all contents of an assets: directory?


Veovis Muaddib

Recommended Posts

I'm looking to add content to my mod from inside the assets folder.  However I'm not sure what the accepted style for doing that is, and how it might interact with resource packs and such.

 

My goal is to iterate over a directory inside Assets/modid/, find all the files with a specific extension, and get an instance of FileReader for each.

 

Example directory structure:

  • Assets/modid
    • lang
    • symbols
      • colors
        • Pink.symbol
        • Tan.symbol

        [*]lengths

        • SeventhLength.symbol
        • FifthLength.symbol
        • ThirdLength.symbol
        • TripleLength.symbol
        • QuintupleLength.symbol
        • SeptupleLength.symbol
        • RealLength.symbol

EDIT: Fixed list formatting

Link to comment
Share on other sites

Ah.  Simple, concise, and clear, thanks.  That explains why I couldn't find anything with more generic searches on loading from classpath, though I'm surprised there wasn't a similar explanation.

 

I've got the basics set up reading from a config file, but I was reading files with groups of symbols in them.  I was hoping to switch to reading a single symbol per file (to cut down on json indentation levels) as I switched to reading from assets.  But if I'll need to maintain an index then I'll just keep using grouped files.

Link to comment
Share on other sites

Ah.  Simple, concise, and clear, thanks.  That explains why I couldn't find anything with more generic searches on loading from classpath, though I'm surprised there wasn't a similar explanation.

 

I've got the basics set up reading from a config file, but I was reading files with groups of symbols in them.  I was hoping to switch to reading a single symbol per file (to cut down on json indentation levels) as I switched to reading from assets.  But if I'll need to maintain an index then I'll just keep using grouped files.

 

You actually can list files from your classpath using the code below:

        InputStream stream = this.getClass().getClassLoader().getResourceAsStream("assets/enderstuffp");
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
        try {
            while( reader.ready() ) {
                System.out.println(reader.readLine());
            }
        } catch( IOException e ) {
            e.printStackTrace();
        }

where this represents your mod class and "assets/enderstuffp" is your assets folder

It prints a list into your console of all files and folders within the assets folder.

Please note that it doesn't do a "deep-search", so you need to write your own method for that if you desire to do a deep search.

  • Sad 1

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

Oh really? That Works? Reliably? Is it documented?

 

I tried it and it seems to work, even if I compile it and load it up as a jar.

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

New to me, thanks for that :)

I will see if I can find some documentation on that.

 

Here is where I've got the code from:

http://stackoverflow.com/questions/13848333/accessing-files-in-specific-folder-in-classpath-using-java

 

And as I said, it seems to work, at least for me.

 

EDIT: If you want to know if a path is a file or a directory, convert the path into an URL, which then is converted into a File (for some reason if I suppy the path string directly, it always thinks it's a file):

File file = new File(this.getClass().getClassLoader().getResource("assets/enderstuffp/" + name).toURI());
System.out.println(file.isDirectory());

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

This worked perfectly, though I had trouble because my resource path was already defined in code as an absolute path rather than a relative path, and it caused some issues.  I got everything up to the directory check working by using Main.class, but I couldn't get the directory check to work.  Once I switched over to relative path I could use the classloader instead of the main class, and now I recursively search folders for children without worry.

 

Thanks again!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • One of my players is suddenly unable to join a locally hosted MC Eternal server. We have been playing on this server for about 2-3 weeks now. I have tried erasing his player files and his reputation file, and now it just coughs up this and kicks him out: [User Authenticator #5/INFO] [minecraft/NetHandlerLoginServer]: UUID of player EthosTheGod is 7692d8db-02c3-424f-a4ab-0e4e259b106b [20:25:36] [User Authenticator #4/INFO] [minecraft/NetHandlerLoginServer]: UUID of player EthosTheGod is 7692d8db-02c3-424f-a4ab-0e4e259b106b [20:29:35] [Server thread/WARN] [minecraft/MinecraftServer]: Can't keep up! Did the system time change, or is the server overloaded? Running 575849ms behind, skipping 11516 tick(s) [20:29:35] [Server thread/INFO] [minecraft/NetHandlerLoginServer]: com.mojang.authlib.GameProfile@4a6c63f1[id=7692d8db-02c3-424f-a4ab-0e4e259b106b,name=EthosTheGod,properties={textures=[com.mojang.authlib.properties.Property@241ea89e]},legacy=false] (/IP.ADDRESS) lost connection: Disconnected [20:29:35] [Server thread/INFO] [minecraft/NetHandlerLoginServer]: com.mojang.authlib.GameProfile@6ab6c661[id=7692d8db-02c3-424f-a4ab-0e4e259b106b,name=EthosTheGod,properties={textures=[com.mojang.authlib.properties.Property@7f19aae3]},legacy=false] (/IP.ADDRESS) lost connection: Disconnected It just says "connection timed out" on his end. Any ideas?
    • I'm trying to migrate my mod from 1.20 to 1.21. Some packages in the forge api were changed so my mod did have some classes not working. I've changed everything i needed but still is getting me the following error error: cannot access Registry DeferredRegister.create(ForgeRegistries.BLOCKS, FarmMod.MOD_ID); ^ class file for net.minecraft.core.Registry not found The piece of code that is wrong is   public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, FarmMod.MOD_ID); And here are my imports   import com.lucas.farmmod.FarmMod; import com.lucas.farmmod.block.custom.BaseIrrigatorBlock; import com.lucas.farmmod.item.ModItems; import com.lucas.farmmod.item.custom.BaseIrrigatorBlockItem; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; The class DeferredRegister is throwing the error in the print below     I've tried running rebuilding my project in every way possible, tried refreshing my dependencies but nothing works. What can i do?
    • It sounds like there might be a synchronization issue with your PartEntity. Ensure that the part entity’s position is updated in your entity's tick method to continuously match the main entity’s location.
    • For keyboard and mouse inputs, Minecraft Forge utilizes the event system to manage interactions, making it easier to handle across different mods. If you’re looking to bypass this and read inputs directly, you’d typically look into the KeyboardListener and MouseListener classes in the game's code. These classes process input events directly from the user's hardware. If you're experimenting with inputs a lot, you might find a compact keypad handy for quick commands. Check out numeric keyboard . It can speed up your coding workflow! Good luck!
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.