I'm working on a FileMaker 18 solution. One of the things I have to solve is executing an external Python script and reading its results back. That script can run for some seconds. Since my solution should work cross-platform (I develop on MacOS, but most users will be on Windows), I settled on the Basic Elements plugin to do the script execution.
Since this is a custom script that we'll deliver together with the solution, FileMaker needs to know in which directory it is located (and also to import the resulting XML). To my surprise, BE_ExecuteSystemCommand defaults to the root directory, not to the directory the solution is installed in.
What is the best practice to get and store a data or other directory that could be user and/or system specific?
My current thought was to create a simple "globals" key/value pair table to store paths and such, and write a script that on launch checks if a value with a key of "datapath" is set, if yes, store it in a global variable other scripts can reference. If not, prompt the user with a file open dialog to select that directory. He would only have to do that once, when launching the solution the first time.
Before doing all that myself, I'm asking here if there is a best practice on how to do that, specifically, or if I'm thinking wrong and should be doing it in some other way?
I will likely be needing the data directory for a few other purposes (data import, etc.) as well.
Filemaker has native functions that return some common paths:
Get(FileMakerPath) - path to the FileMaker application running the current file;
Get(FilePath) - path to the current file;
Get(DocumentsPath) - path to the Documents folder of the current user;
Get(DesktopPath) - path to the desktop folder of the current user;
Get(PreferencesPath) - path to the preferences folder of the current user.
Get(TemporaryPath) - path to the temporary folder of the current user;
Note that the paths returned by these functions are Filemaker paths, not OS paths.
Related
I'm looking for a way to automate archiving where after I plug my two external drives I can copy all my resources. The problem is that I have different file structures on my laptop and on both external drives so I need to select specific folders to be copied. It means that I can't select one root folder and copy it straightforward. I tried to find a way to declare more than one path in the cp command and in the copy command, without success. An example path:
/my_programming_stuff
/folder1
/folder2
/folder3
/folder4
I want to select only the first 3 folders to copy them into external drive1 and external drive 2. The idea is to create a .bat file that will copy everything at once ( in the best case scenario it will be copied simultaneously on both external drives, so it will be much faster). Another problem is that there needs to be a bypass the ntfs long path limitations (max. 260 characters).
Flags that I want to use:
Copy the files and directories and all of their attributes,
including ownerships and permissions.
Recursively copy directories and their contents.
When copying files from one directory to another, only
copy files that either doesn't exist or are newer than the
existing corresponding files, in the destination
directory.
data verification (so it's certain that the copy was verified)
progression bar with time eta
Until now I was using Total Commander to do this but every day I need to pick only a few folders to be copied which takes time and is inefficient.
I have experience with Bash and PowerShell but I am not sure how to handle this topic.
Create a static batch file with robocopy commands. I think /copyall is the only switch you need to specify for all this. Other defaults should satisfy requirements.
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy
I think your time will be better spent learning how to use either FastCopy or FreeFileSynce. I used FreeFileSync some years ago but got disgusted with the it's constantly changing format of its xml file used for starting a backup, so I switched to FastCopy. But it looks like FreeFileSync may be getting their act together and I aim to do some experiments over the summer to see if I want to switch back to it.
Both can handle the long filename format issues, both can be executed by a batch file, both seem to have a lot of quality, but FreeFileSync has more features - and more bloated because of the features. But speed wise, I think FastCopy is probably one of the better products out there and very streamline in use and design.
Every time I simulate in Dymola, a number of "useless" (for me) files are created in the working directory - i.e. dsfinal.txt, dsin.txt, dslog.txt, dsmodel.c, dymosim.exe. I find it annoying as it messes up my directory.
Is there a way to select only the desired output files to be kept after the simulations, without the need of manually deleting the undesired ones?
Those are temporary, but necessary files for Dymola. As far as I know there is no option to delete them automatically. Of course you could script that, but I don't see a real point to it and those files are used by some functionality - e.g. dsfinal.txt is used when as simulation is continued.
Some notes: Those files are created in the working directory - which should contain temporary files only. The working directory can be set via the GUI using File -> Options -> Settings:
A rather common problem is, that there is a Open and a Load function in Dymola:
As the description states, Load does not influence the working directory, whereas Open sets it to the directory from which a file is opened. The latter is also true for opening files e.g. via a double-click from the explorer. So usually it is better to go with Load.
My advice would be to separate the directories in which models/packages are stored and the working directory. This way the working directories content can be fully deleted basically anytime...
In my matlab script I would like to output some files in a specific folder.
My function will accept a path to the desired folder and will check for its existance, but I would also like to implement a default behaviour consisting in saving everything in a default folder (named with day and time) located in the document folder of the computer.
Looking around I found some suggestion (get 'Documents' path in Matlab) on how to detect the correct folder in specific conditions (let's say a Windows PC, the default document folder, something with a specific name, ...). Is there anything more general, usable for all platforms (Win, Mac and Unix)? Or should I implement some switch?
Thanks.
Just making an answer out of Wolfie's comment.
Directly taken from Matlab documentation:
userpath('reset') sets the first folder on the search path to the
default for your platform. The default userpath folder is
platform-specific.
Windows® platforms — %USERPROFILE%/Documents/MATLAB.
Mac platforms — $home/Documents/MATLAB.
Linux® platforms — $home/Documents/MATLAB if $home/Documents exists.
I'm looking for solution to delete or (preferably directly) overwrite source of an exe file while it is running.
To explain further before you get it all wrong, I'll give an example:
I have an exe file on drive D:\ which I run (with previously posted question's answer, giving params to "Start in" folder on C:\Program Files\MyProgram\" so it finds its dlls.
Now after the file is running, I'd like to rewrite the file's byte stream (just like opening it in hex editor...), or at least delete it so I can copy over new exe file directly using same name.
So far the solution I'm using is that I trigger format D: command for the whole drive D:\ (which, in my case is ramdisk and thumb-drive, as I only have this exe on it, I copy it there as necessary), since that removes the file and let's me copy new file there.
Trying to use del myProgram.exe even with -force flag triggers error that access to the file is denied. Same goes if I try to overwrite the contents of the file.
Is there any alternative to do that without using the format command, as that requires to have partition drive only for the purpose?
Update: Note: MoveFileEx and similar techniques that require termination of the process or system restart/reboot are not qualified as a solution. This should be done while the process is running without further actions that can compromise the process's run state.
On a side note, when formatting the drive using the Powershell's format command, the file is gone, although if viewing the partition using Hex viewer tool, there is full binary (hex) content of the exe visible there and an be restored using just as simple as copy-paste technique. This is one of the points as to where overwriting the file contents would be preferable than deleting the file directly.
Please note: This is a knowledge and skills based question, and would therefore appreciate sparing the moral and security-concerning comments about such actions and behaviour.
For deleting/replacing/overwriting a file at least two conditions must be met:
The user performing the operation must have the required permissions to do so. This can be verified for instance via Get-Acl or icacls.
Windows must not have an open handle to the file. This can be checked for instance with tools like Process Explorer or handle. These tools can also be used to forcibly close open handles, although that's not recommended as it may cause data loss and/or damage to the files in question. I'm not sure, though, if it's actually possible to close handles to an executable without terminating the process.
Note that antivirus software is likely to interfere with this kind of operation.
The basic problem here is that Windows loads from the .EXE upon demand, it's not all read in at once.
If you destroy the original file what happens when it tries to load in a page that no longer exists?
If I had to write something of this sort I would copy the .exe to a temporary location (beware that running code from the temp directory may be prohibited), run the new .exe, terminate the old one and then do what I want to it.
I want to export some data from Filemaker. Is there a posibility to start a script with an export dialog were the user defines the export location and store this path in a variable so that the user does not have to define the location for following export scripts?
Thanks for your help!
Dan
If you're willing to use a FileMaker plugin, the free BaseElements plugin has a function called BE_SelectFolder(prompt) which opens an open/save dialog, allows the user to select a folder, and returns the location of the folder as a string. So you'd define two variables
Set Variable [$thePath; value: “BE_SelectFolder("Please choose a folder:")”]
Set Variable [$theRef; value: “"filemac:" & $thePath & "/exportfile.fmp12"”]
(that's for Mac, you'd need to adjust the second variable calc for Windows) and then use $theRef as the file reference to save the exports to.
BaseElements is available from http://www.goya.com.au/baseelements/plugin. It's got a lot of other useful functions besides, it's worth checking out.
There is no FileMaker built-in functionality to return the file path for the exported file.
If the user runs the same export twice in a row, the folder selection dialogue will open at the same location. I suspect this is not what you need.
The easiest way to work around the problem is to use AppleScript on a Mac or VBScript on PC to popup a folder select dialogue, return it back to FileMaker and store in a variable. The rest is down to your workflow.
New in FileMaker 14, from May 2015, in the "Miscellaneus script Step" you may find "Get Directory" which is the right one for your question.
His purpose is described as "Sets a variable to the fully qualified path of a specified folder."
You may also create a new folder, in case of needs, if "Allow Folder Creation" parameter is set.
Note: it is not compatible with FileMaker Go while, instead, you may use it for a RunTime distribution.