mos6581
Goto Top

Visual Studio 2017, VB: Verständnisfrage zum speichern von Dateien

Moin Kollegen,

ich bin kein Programmierer, habe mich aber jetzt eisern durch ein ganzes Progrämmchen durchgebissen. Nur eine Sache kriege ich dabei nicht gebacken, bzw. verstehe ich beim besten Willen nicht, wie VB mit Ordnerstrukturen umgeht.

Das Programm soll mittels der ZIP-Library von ionic ein ZIP-File in einen am besten temporären Ordner generieren und dort abspeichern. Die ZIP wird anschließend vom Programm per E-Mail versandt und kann danach wieder geIöscht werden. Wenn ich z.B. den Pfad mittels System.Windows.Forms.Application.StartupPath definiere, kann er dort keine Datei abspeichern.

Fehlermeldung:

System.IO.FileNotFoundException: "Could not find file 'I:\w\x\y\z\bin\Debug\False'."  

(echter Pfad durch w,x,y,z ersetzt)

Der False-Ordner existierte zu Anfang nicht, allerdings auch keine Änderung, wenn ich den Ordner händisch anlege.

Versuche ich selbst einen Speicherpfad anzugeben, bspw. "C:\test.zip" kommt die Fehlermeldung

System.UnauthorizedAccessException: "Der Zugriff auf den Pfad "C:\DotNetZip-kd0oe3kh.tmp" wurde verweigert."  

Warum versucht er, eine .tmp-Datei anzulegen? Ist das eine Eigenheit im Debugging-Modus?
Gibt es prinzipiell die Möglichkeit, einen Ordner im Programmverzeichnis anzulegen und VB den Pfad dahin begreiflich zu machen, sodass von dort beliebig Dateien gelesen und geschrieben werden können?

Verzeiht meine etwas dümmliche Fragestellung, mein Programmierwissen ist irgendwo zwischen C64-Assembler und ARexx-Scripten hängengeblieben. Vielleicht ist es auch einfach zu warm...

Danke und lG,
MOS

Content-ID: 381761

Url: https://administrator.de/contentid/381761

Ausgedruckt am: 24.11.2024 um 13:11 Uhr

emeriks
Lösung emeriks 30.07.2018 aktualisiert um 17:27:23 Uhr
Goto Top
Hi,
grundsätzlich wirst Du Dich an ionic wenden müssen, wenn Du für deren Produkt Support benötigst.

Ich kenne diesen Zipper nicht, aber ...
"Could not find file 'I:\w\x\y\z\bin\Debug\False'."
... suggeriert mir, dass da ein Dateiname erwartet wird, Du aber einen Ordnernamen übergibst. Ist dem so?
Wann genau kommt denn diese Fehlermeldung?


System.UnauthorizedAccessException:
Ich schätze, Du hast zum Testen den Pfad mit C:\ unglücklich gewählt. Nimm mal zum Testen den Documents- oder Temp-Ordner des Benutzers, unter welchem das Programm läuft. Oder erstelle einen neuen im %ProgramData% und stell sicher, dass der betreffende Benutzer dort Vollzugriff hat.

E.
wiesi200
Lösung wiesi200 30.07.2018 um 20:39:26 Uhr
Goto Top
Hallo,

grundsätzlich muss ich auch sagen der Pfad sieht etwas unglücklich aus. Du wirst Spätestens als normaler User mit dem auch jeder Arbeiten sollte, sogar der Admin, Probleme haben bezüglich Berechtigungen. Windows hat hier ein TEMP Verzeichnis, das sollte man dafür auch verwenden.

Zudem für ein ZIP File brauchst du keine externen Bibliotheken. Das Bringt Windows schon sehr lange mit.
https://msdn.microsoft.com/de-de/library/system.io.compression.zipfile(v ...

Somit hast du auch weniger Sicherheitsproblem durch veraltete Bibliotheken.
Kraemer
Kraemer 31.07.2018 um 08:40:39 Uhr
Goto Top
Moin,


Zitat von @MOS6581:

Moin Kollegen,

bzw. verstehe ich beim besten Willen nicht, wie VB mit Ordnerstrukturen umgeht.
na, so wie jedes andere Windows-Programm auch

Das Programm soll mittels der ZIP-Library von ionic
ich würde das mit Boardmitteln lösen

ein ZIP-File in einen am besten temporären Ordner generieren und dort abspeichern.
und warum machst du das nicht?

Die ZIP wird anschließend vom Programm per E-Mail versandt und kann danach wieder geIöscht werden.
der klassische Anwendungsfall für temporäre Dateien

Wenn ich z.B. den Pfad mittels System.Windows.Forms.Application.StartupPath definiere, kann er dort keine Datei abspeichern.
"blöde" Idee

Fehlermeldung:

System.IO.FileNotFoundException: "Could not find file 'I:\w\x\y\z\bin\Debug\False'."  
schön - Fehlermeldung hilft...allerdings recht wenig, wenn der Code dazu hier nicht steht

(echter Pfad durch w,x,y,z ersetzt)
hui - geheim

Der False-Ordner existierte zu Anfang nicht, allerdings auch keine Änderung, wenn ich den Ordner händisch anlege.
nu kannst nicht in nicht vorhandene Ordner speichern! Eigentlich logisch

Versuche ich selbst einen Speicherpfad anzugeben, bspw. "C:\test.zip" kommt die Fehlermeldung
starte mal Notepad und tippe "Test" und speichere das unter C:\Test.txt. Na - was hast de da? Die selbe Fehlermeldung! Nur ein wenig ausformulierter

System.UnauthorizedAccessException: "Der Zugriff auf den Pfad "C:\DotNetZip-kd0oe3kh.tmp" wurde verweigert."  

Warum versucht er, eine .tmp-Datei anzulegen? Ist das eine Eigenheit im Debugging-Modus?
nein. So werden häufig Dateien erstellt. Sie heißen .tmp bis sie "fertig" sind und werden erst dann umbenannt

Gibt es prinzipiell die Möglichkeit, einen Ordner im Programmverzeichnis anzulegen und VB den Pfad dahin begreiflich zu machen, sodass von dort beliebig Dateien gelesen und geschrieben werden können?
Man speichert keine Daten im Programmverzeichnis, weil da ein normaler User keine Schreibrechte hat!

Verzeiht meine etwas dümmliche Fragestellung, mein Programmierwissen ist irgendwo zwischen C64-Assembler und ARexx-Scripten hängengeblieben. Vielleicht ist es auch einfach zu warm...
ich hoffe letzteres - weil du scheiterst eher an Windows-Grundkenntnissen als an VB-Problemen.

Es gibt von Windows erstellte temporäre Verzeichnisse. Nutze sie.
https://msdn.microsoft.com/de-de/library/system.io.path.gettemppath(v=vs ...
https://msdn.microsoft.com/de-de/library/microsoft.visualbasic.fileio.sp ...

Gruß
MOS6581
MOS6581 31.07.2018 aktualisiert um 10:37:43 Uhr
Goto Top
Moin zusammen,

Danke für euren Input.

@Kraemer die obligatorische Rechtfertigung spare ich mir.

Dass in's Hauptverzeichnis schreiben rechtemäßig mehr als suboptimal ist, weiß ich. Ich hatte bereits verschiedene Pfade ausprobiert und dabei auch sichergestellt, dass Lese- und Schreibrechte bestehen. In C:\ zu speichern war dann mehr eine Verzweiflungstat, um zu sehen, ob und in welche Richtung sich die Fehlermeldung ändert.

Der Grund, warum ich das ZIP-File nicht mit Bordmitteln erstellen lassen will ist, dass ich das File gerne AES-verschlüsselt hätte. Das kann imho das Bordmittel nicht.

Der Code sieht momentan folgendermaßen aus:

Private Sub zipfile()
        Using zip As ZipFile = New ZipFile
            Dim file1 As String
            Dim file2 As String
            Dim file3 As String

            file1 = ListBox1.SelectedIndex = 0.ToString
            file2 = ListBox1.SelectedIndex = 1.ToString
            file3 = ListBox1.SelectedIndex = 2.ToString

            Dim files() As String = ListBox1.Items.Cast(Of String).ToArray
            zip.AddFile(file1)
            zip.Password = TextBox2.Text
            zip.Encryption = EncryptionAlgorithm.WinZipAes256
            zip.Save("File.zip")  
End Using
End Sub 

lG MOS
MOS6581
MOS6581 31.07.2018 um 12:30:44 Uhr
Goto Top
Das Problem ist gelöst, der Fix ist simpel: Da mir das ganze Verhalten der Bibliothek irgendwie merkwürdig vorkam, habe ich die Library einmal deinstalliert und wieder installiert - schon läuft's wie gewünscht.
Danke trotzdem!

Weiterschwitzen,
MOS