Skip to main content
gisteppen
Known Participant
February 21, 2014
Answered

Accessing file system

  • February 21, 2014
  • 1 reply
  • 867 views

My script needs a Framemaker template file in creating a new file. I've made it work by hard-coding the path to the template in the script:

sFilename = "C:\\Users\\gisteppen\\Desktop\\fm change bars\\dev\\changes-template.fm";

I want to make this easy to distribute. I want the script to look for this template file in whatever directory the script resides in, but I find it won't work if I just put the name of the template without the path like this:

sFilename = "changes-template.fm";

Is there a way to get the current directory where the script is from the file system? Then I could construct the absolute path that Fm seems to need.

Or maybe there is a better way to go about this?

Thanks,

Mark

This topic has been closed for replies.
Correct answer frameexpert

You can do something like the code below, which finds a settings file with the same name as the script, but with a .cfg extension.

    // Make a File object for the settings XML file.
    var settingsFile = new File($.fileName.replace (/\.jsx$/i , ".cfg"));
    if (settingsFile.exists === false) {
        $.writeln ("Settings file does not exist: " + settingsFile.fsName);
    }

The $.fileName property gives you the path to the currently running script. Here I am replacing the .jsx extension with .cfg.

In your case, you could use something like this:

    // Make a File object for the template.
    var template = new File($.fileName.replace (/[^\/]+$/, "changes-template.fm"));
    if (template.exists === false) {
        $.writeln ("Template does not exist: " + template.fsName);
    }

One important thing: make sure you save the script before using this code. $.fileName returns (Script#) from an untitled script.

-Rick

1 reply

frameexpert
Community Expert
frameexpertCommunity ExpertCorrect answer
Community Expert
February 22, 2014

You can do something like the code below, which finds a settings file with the same name as the script, but with a .cfg extension.

    // Make a File object for the settings XML file.
    var settingsFile = new File($.fileName.replace (/\.jsx$/i , ".cfg"));
    if (settingsFile.exists === false) {
        $.writeln ("Settings file does not exist: " + settingsFile.fsName);
    }

The $.fileName property gives you the path to the currently running script. Here I am replacing the .jsx extension with .cfg.

In your case, you could use something like this:

    // Make a File object for the template.
    var template = new File($.fileName.replace (/[^\/]+$/, "changes-template.fm"));
    if (template.exists === false) {
        $.writeln ("Template does not exist: " + template.fsName);
    }

One important thing: make sure you save the script before using this code. $.fileName returns (Script#) from an untitled script.

-Rick

www.frameexpert.com
gisteppen
gisteppenAuthor
Known Participant
February 24, 2014

Nice! Not only did you point me at $.fileName to get the path to the running script, which would have been plenty, you gave me a good code implementation with a nice regex to boot. So thanks!

I was looking at the File and Folder objects and not finding what I wanted. I'm going to look more closely at those $.* tools.

I have a question, should I somehow get rid of that File object I'm using? Is there a best practice? Should it be closed like if I open a FrameMaker file with Open()?

Thanks,

Mark

frameexpert
Community Expert
Community Expert
February 24, 2014

You don't have to worry about closing a File object unless you actually open it with the open method.

www.frameexpert.com