У меня есть приложение Java, которое будет использоваться как из командной строки Windows, так и из терминала Cygwin. Программа использует и манипулирует путями к файлам. Было бы очень полезно иметь переменную sep
, которая была бы /
при запуске программы из Cygwin и \\
при запуске программы из Windows.
Глядя здесь, я не уверен, что это будет возможно, но я хочу спросить.
Я опубликую небольшое компилируемое приложение, которое покажет проблему через несколько минут. А пока я просто скажу, что мне нужен набор функций, что-то вроде:
// in main
...
String sep = getSeparatorToUse();
...
// member functions
...
private boolean wasLaunchedFromWinCmd()
{
if (<something-here-that-knows-it-was-cmd-not-cygwin>)
return true;
return false;
}//endof: private boolean wasLaunchedFromWinCmd()
private String getSeparatorToUse()
{
if (wasLaunchedFromWinCmd)
return "\\"
return "/"
}//endof: private String getSeparatorToUse()
Спасибо @Raphael_Moita. Это очень полезно, и я, скорее всего, буду использовать их в версии приложения для Linux, которую буду использовать. @Luke_Lee, я чувствую себя глупо, не осознавая этого. Думаю, вы двое могли бы решить мою проблему, пока я готовил компилируемый код. Есть еще одна проблема, когда программа запускается из пакетного скрипта - когда ей передается имя файла из команды find
. Надеюсь, то, что я покажу, проиллюстрирует это.
Примеры
Все примеры запускаются из Cygwin.
Работает: так же, как большинство добровольцев используют код, просто имя файла находится в том же каталоге, что и java-код.
$ java FileSeparatorExample pic_4.jpg
Here, something will be done with the file,
C:\Users\bballdave025\Desktop\pic_4.jpg
Работает: с относительными путями к файлам и пробелами в именах файлов/путях к файлам
$ java FileSeparatorExample pretty\ pictures/pic\ 1.jpg
Here, something will be done with the file,
C:\Users\me\Desktop\pretty pictures/pic 1.jpg
$ java FileSeparatorExample ../pic_5.jpg
Here, something will be done with the file,
C:\Users\me\Desktop\../pic_5.jpg
НЕ РАБОТАЕТ. Иногда вывод команды find
будет содержать полный путь к файлу в формате Cygwin/UNIX:
$ java FileSeparatorExample /cygdrive/c/David/example/pic.jpg
The file:
C:\Users\bballdave025\Desktop\/cygdrive/c/David/example/pic.jpg
doesn't exist
Компилируемый код
Я просто сокращаю исходный код, поэтому извините, если он кажется слишком большим.
/**********************************
* @file FileSeparatorExample.java
**********************************/
// Import statements
import java.io.File;
import java.io.IOException;
public class FileSeparatorExample
{
// Member variables
private static String sep;
public static void main(String[] args)
{
////****** DOESN'T WORK AS DESIRED ******////
sep = java.io.File.separator;
////** I want **////
// sep = getFileSeparator();
String imageToLoad = null;
boolean argumentExists = ( args != null && args.length != 0 );
if (argumentExists)
{
boolean thereIsExactlyOneArgument = ( args.length == 1 );
if (thereIsExactlyOneArgument)
{
imageToLoad = args[0];
}//endof: if (thereIsExactlyOneArgument)
else
{
// do some other stuff
}
}//endof: if (argumentExists)
String filenamePath = getFilenamePath(imageToLoad);
String filenameFile = getFilenameFile(imageToLoad);
imageToLoad = filenamePath + sep + filenameFile;
File f = new File(imageToLoad);
if (! f.exists())
{
System.err.println("The file:");
System.err.println(imageToLoad);
System.err.println("doesn\'t exist");
System.exit(1);
}//endof: if (! f.exists())
System.out.println("Here, something will be done with the file,");
System.out.println(imageToLoad);
}//endof: main
// member methods
/**
* Separates the filename arg into: full path to directory; bare filename
*/
private static String[] splitFilename(String imageToLoad)
{
String[] fileParts = new String[2];
int indexOfLastSep = imageToLoad.lastIndexOf(sep);
boolean fullFilenameHasSeparator = ( indexOfLastSep != -1 );
if (fullFilenameHasSeparator)
{
fileParts[0] = imageToLoad.substring(0, indexOfLastSep);
fileParts[1] = imageToLoad.substring(indexOfLastSep + 1);
}//endof: if (fullFilenameHasSeparator)
else
{
// Use the user's directory as the path
fileParts[0] = System.getProperty("user.dir");
fileParts[1] = imageToLoad;
}//endof: if/else (fullFilenameHasSeparator)
return fileParts;
}//endof: private static String[] splitFilename(String imageToLoad)
/**
* Gives the full path to the file's directory (from the filename arg)
* but not the bare filename
*/
private static String getFilenamePath(String imageToLoad)
{
String[] fileParts = splitFilename(imageToLoad);
return fileParts[0];
}//endof: private static String getFilenamePath(String imageToLoad)
/**
* Gives the bare filename (no path information)
*/
private static String getFilenameFile(String imageToLoad)
{
String[] fileParts = splitFilename(imageToLoad);
return fileParts[1];
}//endof: private static String getFilenamePath(String imageToLoad)
}//endof: public class FileSeparatorExample
cygpath
. Если бы я знал, что путь к файлу будет передан с использованием пути в стиле UNIX, я мог бы использовать:java $(cygpath -wp <file-argument>)
В моем случае это не сработает. Во всяком случае, это не имело бы смысла, поскольку у тех, кто будет использовать программу из Cygwin, не возникнет проблем с необходимостью конвертировать свой путь в стиле UNIX в путь в стиле Windows. - person bballdave025   schedule 30.11.2016/
. - person xiaofeng.li   schedule 30.11.2016