Ordner zippen

AndiixAndii

Mitglied
Hi!

Ich habe ein Programm geschrieben, dass die Firefox-Profile exportiert und zippt.
Mein Problem ist, dass ich zwar den kopierten Ordner erhalte, aber keine zip-Datei erstellt wird.
Ich bekomme folgende Exception:
java.io.FileNotFoundException: C:\Users\Andreas\AppData\Local\Temp\MozillaFirefox\Profiles (Zugriff verweigert)

Warum kann ich auf den kopierten Ordner nicht zugreifen und die Datei zippen?

Java:
import java.io.*;
import java.util.zip.*;

public class Main {

    public static void main(String[] args) {
        String profile = System.getenv("APPDATA") + "\\Mozilla\\Firefox\\Profiles";
        String dest = System.getenv("TEMP") + "\\MozillaFirefox\\Profiles";
        String zipfile = System.getenv("TEMP") + "\\MozillaFirefox\\profiles.zip";
        try {
            File profileDir = new File(profile);
            File destDir = new File(dest);
            copyDirectory(profileDir, destDir);
            ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(destDir));
            zip(zipfile, zos);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void copyDirectory(File source, File target) {
        File[] files = source.listFiles();
        File newFile = null;
        target.mkdirs();
        if (files != null) {
            for (File file : files) {
                newFile = new File(target.getAbsolutePath() + "\\" + file.getName());
                if (file.isDirectory()) {
                    copyDirectory(file, newFile);
                } else {
                    copyFile(file, newFile);
                }
            }
        }
    }

    public static void copyFile(File source, File target) {
        try {
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(source));
            BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(target, true));
            int bytes = 0;
            while ((bytes = in.read()) != -1) {
                out.write(bytes);
            }
            in.close();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void zip(String dir2zip, ZipOutputStream zos) {
        try {
            File zipDir = new File(dir2zip);
            String[] dirList = zipDir.list();
            byte[] readBuffer = new byte[2156];
            int bytesIn = 0;
            for (int i = 0; i < dirList.length; i++) {
                File f = new File(zipDir, dirList[i]);
                if (f.isDirectory()) {
                    String filePath = f.getPath();
                    zip(filePath, zos);
                    continue;
                }
                FileInputStream fis = new FileInputStream(f);
                ZipEntry anEntry = new ZipEntry(f.getPath());
                zos.putNextEntry(anEntry);
                while ((bytesIn = fis.read(readBuffer)) != -1) {
                    zos.write(readBuffer, 0, bytesIn);
                }
                fis.close();
            }
            zos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 
(Zugriff verweigert)

Ich wage, die blasphemische Hypothese aufzustellen, dass der Zugriff verweigert wurde. Ich würde an deiner Stelle die Schreibrechte überprüfen und gegebenenfalls neusetzen. Windows hat die Eigenart, sehr wenige Rechte bei manchen Programmen zu setzen. Wenn du sichergehen willst, dass es funktioniert, solltest du bei jedem User Vollzugriff setzen.

Einfach Eigenschaften -> Sicherheit -> Bearbeiten
 
Wie Sasuke bereits geschrieben hat liegt es wohl an Windows und nicht an deinem Java-Code. Am besten sämtliche Unterordner für alle zur Verfügung stellen, sowohl Schreibrechte als auch Leserechte. Wäre cool wenn du dann deine Erfahrungen uns wieder mitteilen könntest, würde mich auch interessieren. 😉

Ich hab ab der "Local" - Ebene alles zu Testzwecken mal vom "schreibgeschützten" entfernt, hat aber so nicht geklappt.
 
Ich wage, die blasphemische Hypothese aufzustellen, dass der Zugriff verweigert wurde.
Danke, darauf bin selbst auch schon gekommen. 😀

Ich würde an deiner Stelle die Schreibrechte überprüfen und gegebenenfalls neusetzen. Windows hat die Eigenart, sehr wenige Rechte bei manchen Programmen zu setzen. Wenn du sichergehen willst, dass es funktioniert, solltest du bei jedem User Vollzugriff setzen.

Einfach Eigenschaften -> Sicherheit -> Bearbeiten
Ich habe die .jar-Datei auf Vollzugriff gesetzt und sie auch als Administrator gestartet, ich krieg trotzdem die Exception und keine .zip sondern nur den Ordner.
 
Wie Sasuke bereits geschrieben hat liegt es wohl an Windows und nicht an deinem Java-Code. Am besten sämtliche Unterordner für alle zur Verfügung stellen, sowohl Schreibrechte als auch Leserechte. Wäre cool wenn du dann deine Erfahrungen uns wieder mitteilen könntest, würde mich auch interessieren. 😉

Ich hab ab der "Local" - Ebene alles zu Testzwecken mal vom "schreibgeschützten" entfernt, hat aber so nicht geklappt.

Da musst du aufpassen. Windows hat ein Talent, den Schreibschutz rekursiv neuzusetzen, sobald man ihn ändert.

Danke, darauf bin selbst auch schon gekommen. 😀


Ich habe die .jar-Datei auf Vollzugriff gesetzt und sie auch als Administrator gestartet, ich krieg trotzdem die Exception und keine .zip sondern nur den Ordner.

Das muss nichts heißen. Du sollst die Rechte des Zielordners auf Vollzugriff setzen. Es kommt vor dass das System selbst oder der Administrator selbst keine vollen Schreibrechte haben. Kommt auch auf dein Windoof an.
 
Zuletzt bearbeitet:
Da musst du aufpassen. Windows hat ein Talent, den Schreibschutz rekursiv neuzusetzen, sobald man ihn ändert.



Das muss nichts heißen. Du sollst die Rechte des Zielordners auf Vollzugriff setzen. Es kommt vor dass das System selbst oder der Administrator selbst keine vollen Schreibrechte haben. Kommt auch auf dein Windoof an.

Hab alle Ordner mit denen mein Programm arbeitet und das Programm selbst auf "Vollzugriff" gesetzt und ich krieg die Exception noch immer 🙁
 
Mal so in den Raum geworfen - Kann es sein, dass wenn du dein Programm als Admin durchführst, die "Abarbeitung" des Codes bzw. das rausschreiben der Files trotzdem als User durchgeführt wird und somit die Exception fliegt? Darf eigentlich nicht sein.. Was aber trotzdem nichts heißen würde, da eh alles auf Vollzugriff gesetzt ist...

Beim kurzen googeln bin ich auf eine Anmerkung gestoßen, die irgendwas von der Exception im Bezug auf identischen Namen auswirft, vllt. bring dir das was..
 
Zuletzt bearbeitet:
Hab's nur kurz überflogen, aber vllt. findest du darin deine Lösung: java - IOException - Access Denied Using FileOutputStream - Stack Overflow

So ich hab mir den Thread mal durchgelesen. Da geht es ja darum, dass der Ordner, der erstellt wird den selben Namen hat, wie die Datei, die erstellt wird.
Bei mir heißt der Ordner ja Profiles und die Datei profiles.zip und selbst wenn ich die Datei anders nenne z.B. "zipped_profiles.zip" krieg ich die Exception.
 

Zurück
Oben