How to get the path of the sketch in Processing ? (dataPath not working)

Using Processing 3-0-1 (not updated yet), I have a problem with the dataPath() function.

My code :

final String path = dataPath(""); //... void setup(){ //... println(path); //... } 

This displays in the console :

/media/ubuntu/Expansion Drive/Programmation/Java/Processing/Ubuntu/processing-3.0.1/null/data

but it should display (according to the Documentation and my tries in other projects) :

/media/ubuntu/Expansion Drive/Programmation/Java/Processing/Projets/Time_Fighter/data

So it seems it's returning a path the Processing instead of a path to my project ? Plus, why is there a 'null' ?

The question is, do you know a way that would work to have the path of my sketch ?

PS. A friend of mine proposed to use the File class instead, I had this result :

File file = new File("data"); //... void setup(){ //... file.getAbsolutePath(); //... } 

Which returned :

/media/ubuntu/Expansion Drive/Programmation/Java/Processing/Ubuntu/processing-3.0.1/data

PPS. I'm using Ubuntu (Mate)...

2 Answers

You shouldn't use the dataPath() function. You should use the sketchPath() function.

From the Processing source for dataPath():

/** * <b>This function almost certainly does not do the thing you want it to.</b> * The data path is handled differently on each platform, and should not be * considered a location to write files. It should also not be assumed that * this location can be read from or listed. This function is used internally * as a possible location for reading files. It's still "public" as a * holdover from earlier code. * <p> * Libraries should use createInput() to get an InputStream or createOutput() * to get an OutputStream. sketchPath() can be used to get a location * relative to the sketch. Again, <b>do not</b> use this to get relative * locations of files. You'll be disappointed when your app runs on different * platforms. */ public String dataPath(String where) { return dataFile(where).getAbsolutePath(); } 

And here's sketchPath():

/** * Prepend the sketch folder path to the filename (or path) that is * passed in. External libraries should use this function to save to * the sketch folder. * <p/> * Note that when running as an applet inside a web browser, * the sketchPath will be set to null, because security restrictions * prevent applets from accessing that information. * <p/> * This will also cause an error if the sketch is not inited properly, * meaning that init() was never called on the PApplet when hosted * my some other main() or by other code. For proper use of init(), * see the examples in the main description text for PApplet. */ public String sketchPath(String where) { if (sketchPath() == null) { return where; } // isAbsolute() could throw an access exception, but so will writing // to the local disk using the sketch path, so this is safe here. // for 0120, added a try/catch anyways. try { if (new File(where).isAbsolute()) return where; } catch (Exception e) { } return sketchPath() + File.separator + where; } 

sketchPath() only works after setup(), you can't do

String path = sketchPath(); setup() { } 

Instead, you need to do:

String path; setup() { path = sketchPath(); } 

(Processing 3.5.4)

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like