Hi ich möchte eine Datei in ein anders Verzeichnis kopieren.
Dazu verwende ich folgenden Code:
Ich habe nun ein Problem mit den File Seperatoren.
Wenn ich unter Windows 7 eine Datei habe und mir über file.getAbsolutePath() den Pfad hole erhalte ich den Namen in dieser Form: C:\Users\Ich\Documents\MeinBild.jpg
Dadurch kommt es bei der Ausführung von
inChannel = new FileInputStream(inF).getChannel();
zu einer Exception. Dies liegt an dem File Seperator.
Wenn anstelle von
C:\Users\Ich\Documents\MeinBild.jpg
dies hier steht:
C:\\Users\\Ich\\Documents\\MeinBild.jpg oder C:/Users/Ich/Documents/MeinBild.jpg
dann funktioniert alles bestens.
Das Problem: Wie forme ich den Pfadnamen den ich über file.getAbsolutePath() immer so
automatisch um, dass mir FileInputStream(inF).getChannel() keine Exception schmeißt.
Dies soll aber auf allen Betriebssystem funktionieren.
Für Windows könnte ich filename.replace('\', '\\') aufrufen.
Bei Linux müsste ich denk ich nichts ändern.
Und für Macs und andere Betriebssysteme, weiß ich grad nicht wie ich da was ändern müsste.
Allerdings müßte ich dann auch im Code abfragen um welches Betriebssystem es sich handelt um eine
korrekte Ersetzung machen zu können. Doch das erscheint mir irgendwie hässlich, mal abgesehen davon dass ich grad spontan auch nicht weiß, ob das einfach so möglich ist.
filename.replace('\', File.separator);
würde aus zwei Gründen nicht funktionieren.
(Problem mit dem ersten Parameter der der Methode replace übergeben wird)
zum einen habe ich beim ersten Parameter jetzt einfach gesagt ersetze mir '\' durch File.Seperator. Der erste Parameter '\' wäre aber nur unter Windows richtig, denn auf anderen Betriebssystemen würde ich über file.getAbsoulutePath() einen String erhalte der andere Seperatoren verwendet.
Also muss ich den ersten Parameter bei replace() dynamisch setzen.
Doch wie erfahre ich welche Seperatoren in file.getAbsoulutPath() String verwendet werden um diese als ersten Parameter der Methode replace übergeben zu können.
(Problem mit dem zweiten Parameter der der Methode replace übergeben wird)
Der Zweite Grund wieso dies nicht funktioniert ist, dass ich bei Windows 7 zum Beispiel mit File.seperator '\' erhalte. Doch im zweiten Parameter bei replace müßte '\\' oder '/' damit alles korrekt funktioniert.
Dazu verwende ich folgenden Code:
Java:
String filename = file.getAbsolutePath(); //unter windows7 z.B. "C:\Users\Ich\Documents\MeinBild.jpg"
File inF = new File(filename);
File outF = new File("PICTURES\\pictrash.jpg");
if(!outF.exists())
{
try
{
outF.createNewFile();
}
catch (IOException e)
{
e.printStackTrace();
}
}
FileChannel inChannel = null;
FileChannel outChannel = null;
try
{
inChannel = new FileInputStream(inF).getChannel(); //Exception wird geworfen falls "C:\Users\Ich\Documents\MeinBild.jpg" anstelle von " "C:\\Users\\Ich\\Documents\\MeinBild.jpg" unter Windows
outChannel = new FileOutputStream(outF).getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
}
catch (FileNotFoundException e1)
{
e1.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if(inChannel != null)
{
try
{
inChannel.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if(outChannel != null)
{
try
{
outChannel.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
Ich habe nun ein Problem mit den File Seperatoren.
Wenn ich unter Windows 7 eine Datei habe und mir über file.getAbsolutePath() den Pfad hole erhalte ich den Namen in dieser Form: C:\Users\Ich\Documents\MeinBild.jpg
Dadurch kommt es bei der Ausführung von
inChannel = new FileInputStream(inF).getChannel();
zu einer Exception. Dies liegt an dem File Seperator.
Wenn anstelle von
C:\Users\Ich\Documents\MeinBild.jpg
dies hier steht:
C:\\Users\\Ich\\Documents\\MeinBild.jpg oder C:/Users/Ich/Documents/MeinBild.jpg
dann funktioniert alles bestens.
Das Problem: Wie forme ich den Pfadnamen den ich über file.getAbsolutePath() immer so
automatisch um, dass mir FileInputStream(inF).getChannel() keine Exception schmeißt.
Dies soll aber auf allen Betriebssystem funktionieren.
Für Windows könnte ich filename.replace('\', '\\') aufrufen.
Bei Linux müsste ich denk ich nichts ändern.
Und für Macs und andere Betriebssysteme, weiß ich grad nicht wie ich da was ändern müsste.
Allerdings müßte ich dann auch im Code abfragen um welches Betriebssystem es sich handelt um eine
korrekte Ersetzung machen zu können. Doch das erscheint mir irgendwie hässlich, mal abgesehen davon dass ich grad spontan auch nicht weiß, ob das einfach so möglich ist.
filename.replace('\', File.separator);
würde aus zwei Gründen nicht funktionieren.
(Problem mit dem ersten Parameter der der Methode replace übergeben wird)
zum einen habe ich beim ersten Parameter jetzt einfach gesagt ersetze mir '\' durch File.Seperator. Der erste Parameter '\' wäre aber nur unter Windows richtig, denn auf anderen Betriebssystemen würde ich über file.getAbsoulutePath() einen String erhalte der andere Seperatoren verwendet.
Also muss ich den ersten Parameter bei replace() dynamisch setzen.
Doch wie erfahre ich welche Seperatoren in file.getAbsoulutPath() String verwendet werden um diese als ersten Parameter der Methode replace übergeben zu können.
(Problem mit dem zweiten Parameter der der Methode replace übergeben wird)
Der Zweite Grund wieso dies nicht funktioniert ist, dass ich bei Windows 7 zum Beispiel mit File.seperator '\' erhalte. Doch im zweiten Parameter bei replace müßte '\\' oder '/' damit alles korrekt funktioniert.