У меня есть приложение Java, которое будет использоваться как из командной строки Windows, так и из терминала Cygwin. Программа использует и управляет путями файлов. Нам очень полезно иметь переменную sep
, которая будет /
при запуске программы с Cygwin, но \\
при запуске программы из Windows.Быстро найти, была ли запущена Java из Windows cmd или терминала Cygwin
Глядя here, я не уверен, что это будет возможно, но я хочу спросить.
Я выложу небольшое, компилируемое приложение, которое покажет проблему через несколько минут. На данный момент, я просто скажу, что я хочу, набор функций, что-то вроде:
// 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
придет с полным FilePath в формате 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)' Это не будет работать в моем случае. Во всяком случае, это не имело бы смысла, поскольку у тех, кто будет использовать программу Cygwin, не было бы проблем, связанных с преобразованием их стиля в стиле UNIX в путь в стиле Windows. –
bballdave025
Вы всегда можете использовать '/'. –