package jalview.util;
import java.io.File;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Miscellaneous file-related functions
*/
public final class FileUtils
{
/**
* Answers the executable file for the given command, or null if not found or
* not executable. The path to the executable is the command name prefixed by
* the given folder path, optionally with .exe appended.
*
* @param cmd
* command short name, for example hmmbuild
* @param binaryPath
* parent folder for the executable
* @return
*/
public static File getExecutable(String cmd, String binaryPath)
{
File file = new File(binaryPath, cmd);
if (!file.canExecute())
{
file = new File(binaryPath, cmd + ".exe");
{
if (!file.canExecute())
{
file = null;
}
}
}
return file;
}
/**
* Answers the path to the folder containing the given executable file, by
* searching the PATH environment variable. Answers null if no such executable
* can be found.
*
* @param cmd
* @return
*/
public static String getPathTo(String cmd)
{
String paths = System.getenv("PATH");
// backslash is to escape regular expression argument
for (String path : paths.split("\\" + File.pathSeparator))
{
if (getExecutable(cmd, path) != null)
{
return path;
}
}
return null;
}
/**
* A convenience method to create a temporary file that is deleted on exit of
* the JVM
*
* @param prefix
* @param suffix
* @return
* @throws IOException
*/
public static File createTempFile(String prefix, String suffix)
throws IOException
{
File f = File.createTempFile(prefix, suffix);
f.deleteOnExit();
return f;
}
/**
* Answers a (possibly empty) list of file paths found by searching below
* from
that match the supplied regular expression
* pattern
. Results may include from
itself if it
* matches. If an exception occurs it is written to syserr and any results up to
* that point are returned. Note that the regular expression match applies to
* the whole path of any matched file.
*
* WARNING: because the whole directory tree below from
is
* searched, this method may be slow if used for a high level directory, or may
* exit prematurely if security or other exceptions occur.
*
*
* Example: * findMatchingPaths(Paths.get("C:/Program Files"), ".*/chimera.exe$") ** * @param from * @param pattern * * @return * @see https://stackoverflow.com/questions/794381/how-to-find-files-that-match-a-wildcard-string-in-java/31685610#comment62441832_31685610 */ public static List
* For example * *
* findMatches("C:\\", "Program Files*/Chimera*/bin/{chimera,chimera.exe}" ** * would match "C:\Program Files\Chimera 1.11\bin\chimera.exe" and "C:\Program * Files (x86)\Chimera 1.10.1\bin\chimera" * * @param root * @param pattern * @return * @see https://docs.oracle.com/javase/tutorial/essential/io/fileOps.html#glob */ public static List