FileChannel (inChannel/outChanel) Fehler wenn Leerzeichen enthalten

richis-fragen

Bekanntes Mitglied
Guten Tag

wenn:
Java:
inChannel = new FileInputStream(file).getChannel();

file Leerzeichen enthält, wird mir der Zugriff verweigert.
Erstelle ich ein File renamIn = new File(file.getPath().replaceAll(" ", "§"));
und dieses dann dem inChanel resp. outChanel übergebe, wird es nicht gefunden!

Weiss jemand wie man das am einfachsten lösen kann?

Mein Ansatz:
Code:
    File inputF = file;
    String aktInFile = inputF.getAbsolutePath().replaceAll(" ", "§");
    File renamIn = new File(aktInFile);
                       
    //file am Ursprung umbenennen und dem inChannel übergeben.
    inputF.renameTo(renamIn);
    File forCPin = renamIn;
    inChannel = new FileInputStream(forCPin).getChannel();
                       
    inChannel.transferTo(0, inChannel.size(), outChannel);
                       
    //Umbenennen rückgängig machen (in original file)
    forCPin.renameTo(f);
Dies funktioniert soweit... (Wenn der Anwender Schreibzugriff hat)
Aber bei 3000 Dateien extrem langsam, zumal dies auch für die Gegenseite von transferTo(...) gemacht werden muss.
(sofern der Zielort nicht Lokal ist)

Für Tips bin ich sehr Dankbar.
 
Zuletzt bearbeitet:

richis-fragen

Bekanntes Mitglied
Fehlermeldung bei nicht behandeltem File:
Java:
java.io.FileNotFoundException: /media/benutzername/ftp/domain.ch/Bilder/Test Kopie.png (Keine Berechtigung)
    at java.base/java.io.FileInputStream.open0(Native Method)
    at java.base/java.io.FileInputStream.open(FileInputStream.java:213)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:155)
    at basics.WindowSettings.copyFile(WindowSettings.java:179)
    at bigCopy.BigCopy.sizeChecker(BigCopy.java:393)
    at bigCopy.BigCopy.main(BigCopy.java:109)
 

richis-fragen

Bekanntes Mitglied
Habe es jetzt so gelösst:
Prüfe erst:
Java:
System.getProperty("os.name");
und verwende entsprechende Konsolenbefehle.
Da wird kein File() übergeben sonden ein String welchen ich mit Hochkommas versehe.
Beispiel Linux: (auch mac und andere UNIX-Systemen)
cp '/media/benutzername/ftp/domain.ch/Bilder/Test Kopie.png' '.../Bilder/Test Kopie.png'
Auch in Windows kann man so (mit den dos-Befehlen) arbeiten.

Vielen Dank.
 

Robert Zenz

Top Contributor
Das hat aber nichts mit dem FileChannel zu tun wenn ich das richtig sehe, du kannst auch mit dem FileInputStream nicht auf die Datei zugreifen weil du eben keine Berechtigung hast. Wieso das so sein sollte ist etwas schwerer zu sagen, entweder das Dateisystem welches da eingehaengt ist macht komische Sachen, oder SELinux verbietet es. Ersteres klingt nach einem interessanten Kandidaten wenn das ueber FTP geht. Wobei da vielleicht ein "richtiger" FTP-Client besser waere, vielleicht, kommt darauf an was du machst.

In der neuen Java NIO API gibt es die Files Klasse welche eine copy(Path, Path) Methode hat. Vielleicht reicht dir das ja aus anstatt da mit den FileChannel zu handieren (was mir ohnehin eigenartig vorkommt).

Wieso gehst du eigentlich auf FileChannel-Ebene hinunter? Der obige Code kann mit Streams genauso gemacht werden, oder sogar mit `Path`s.
 

richis-fragen

Bekanntes Mitglied
Wobei da vielleicht ein "richtiger" FTP-Client besser waere
Das Laufwerk wird als "richtiges" FTP eingehängt!
curlftpfs#ftp://ftp.domain.xxx/ (mit allen relevanten Benutzerinformationen und entsprechenden Rechten)
(verwende ein Linux-System)

Das "ftp" im Pfadname ist nur mein Ordner in dem obiges eingehängt wird!
anstatt da mit den FileChannel zu handieren (was mir ohnehin eigenartig vorkommt).
Das leuchte mir ein und ich werde es auch nicht mehr verwenden.

Mein kleines Projekt sollte einem Benutzer nur die Möglichkeit geben, Daten von A nach B zu kopieren!
Unabhängig ob es Lokale Datenträger oder gemountete FTP-, Netzlaufwerke sind.

Bei besagten Usern handelt es sich meist um ältere Benutzer die Mühe haben mit den neuen Techs.
Diese haben meist schon Probleme mit drag&drop resp. copy/past.
Soll heissen:
  1. Wähle die Ordner / die Dateien aus die Du kopieren möchtest:
  2. Wähle den Ordner aus in dem die Ordner / die Dateien gespeichert werden sollen:
thats all.
Rest erledigt mein kleines Programm.

Man müsste die Software Entwickler dazu bringen, dass solche Dateinamen nicht generiert werden können:
Beispiel: MeinVideo 24.09.18° 1:45''30'.mp4 oder so ähnlich...

Intresannterweise beherschen Konsole-Befehle solche Dateinamen, wenn man sie in Anführungszeichen resp. Hochkomma setzt.
In der Regel verwende ich Anführungszeichen. In Sonderfällen können Hochkommas dienen.

habe ich mir mal angeschaut.

Ich verwende OpenJDKs
Einige Quell-Texte werden mir nicht angezeigt.
Also werde ich immer andere Lösungen suchen.
 

Ähnliche Java Themen


Oben