Argument Exception: Illegales Zeichen im Pfad??

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von m477h35.

    Argument Exception: Illegales Zeichen im Pfad??

    Hallo!
    Bei folgendem Code

    VB.NET-Quellcode

    1. Dim filetext = System.IO.File.Open(OpenFileDialog1.FileName, System.IO.FileMode.Open)
    2. Dim UTF8Enc As System.Text.UTF8Encoding = New System.Text.UTF8Encoding(True)
    3. Dim buffer As Byte()
    4. 'Imagedata length
    5. ReDim buffer(8)
    6. filetext.Position = 39
    7. filetext.Read(buffer, 0, 8)
    8. Dim length As Integer = CInt(UTF8Enc.GetString(buffer))
    9. 'Image format
    10. ReDim buffer(4)
    11. filetext.Position = 47
    12. filetext.Read(buffer, 0, 4)
    13. Dim imgformat As String = UTF8Enc.GetString(buffer)
    14. 'Imagedata and creation of temporary image file
    15. ReDim buffer(length)
    16. filetext.Position = 50
    17. filetext.Read(buffer, 0, length)
    18. Dim imgfilepath As String = My.Computer.FileSystem.GetTempFileName().Replace(".", "") & imgformat
    19. Dim imgfile = System.IO.File.Open(imgfilepath, IO.FileMode.Open) '<-- Exception!
    20. imgfile.Write(buffer, 0, buffer.Length)
    21. imgfile.Close()
    22. Dim img As New System.Drawing.Bitmap(imgfilepath)
    23. PictureBox1.Image = img


    bekomme ich bei der markierten Zeile eine ArgumentException: es soll angeblich ein illegales Zeichen im Pfad sein. Zum Zeitpunkt der Exception befindet sich folgender String in der Variablen:

    VB.NET-Quellcode

    1. imgfilepath = "C:\Users\MAR\AppData\Local\Temp\tmp7F48tmp.png"


    Wird jemand schlau daraus?

    PS: Bitte nicht den Code auf Fehler überprüfen, ich stecke mitten in der Entwicklung, und beim Austesten bekam ich diesen Fehler.
    Eine Argument-Exception bedeutet in der regel, das du in einer Parameterliste Quark drinne stehen hast. Entweder zuviel Quark, zu weni Quarl oder eben falschen Quark ;)

    Also falsche Anzahl an Parametern oder eben falsche Parametertypen.
    Wenn der Pfad nicht richtig wäre, dann wäre der Fehler anders, weis es nicht mehr, aber irgendwas anderes war es gewesen. Kannst du jedoch zur Hilfe bitte die komplette fehlermeldung heir hinein posten? Wäre Hilfreich ;)
    Spoiler anzeigen
    System.ArgumentException wurde nicht behandelt.
    Message=Illegales Zeichen im Pfad.
    Source=mscorlib
    StackTrace:
    bei System.IO.Path.CheckInvalidPathChars(String path)
    bei System.IO.Path.GetFileName(String path)
    bei System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
    bei System.IO.File.Open(String path, FileMode mode)
    bei ecs_Editor.Form1.ÖffnenToolStripMenuItem_Click(Object sender, EventArgs e) in C:\Users\MAR\Documents\Visual Studio 2010\Projects\ecs-Editor\ecs-Editor\Form1.vb:Zeile 105.
    bei System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
    bei System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
    bei System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
    bei System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
    bei System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
    bei System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
    bei System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
    bei System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
    bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
    bei System.Windows.Forms.ToolStrip.WndProc(Message& m)
    bei System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
    bei ecs_Editor.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
    bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    bei System.Threading.ThreadHelper.ThreadStart()
    InnerException:
    darf ich die Inner Exception auch noch sehen? wenn der Error kommt, dort mal bitte auf Details, da kannst du über baumstruktur ziemlich weit in den Error "reinsehen"... Ansonsten... werde ich gerade auch nicht daraus schlau. Vor allem sieht der Pfad... richtig aus, wenn die uhrzeit mir keine STreiche spielt.
    Probiere einfach mal ein paar verzeichnisse durch, evtl (ist einfach mal ein gerücht, das ich nun verbreite) liegt es daran, das du ins temp willst, oder die ganzen zahlen im Dateinamen hast oder einfach weil er nicht will... ich kann es dir nicht sagen. Versuche einfach mal andere dateien mit selber Endung, selbem verzeichnis, zahlen im namen, so dingfe nach und nach abzutesten...
    @petaod: Die Zeile hab ich extra deswegen eingefügt, weil die GetTempFileName-Funktion normalerweise "C:\Users\MAR\AppData\Local\Temp\tmp7F48.tmp" liefert. Ich hab dann einfach ".png" angehängt und dachte, dass der erste Punkt im Dateinamen den Fehler liefert, was aber anscheinend nicht der Auslöser war^^

    @Kagurame: Okay, werde es mal versuchen.
    Aus der MSDN zur GetTempFileName()-Funktion:
    "Erstellt eine eindeutig benannte temporäre Datei mit einer Größe von 0 Byte auf dem Datenträger und gibt den vollständigen Pfad dieser Datei zurück."
    Hab auch per Explorer nachgeschaut: Die Dateien werden immer erstellt.

    Anscheinend liegt es aber dennoch an der GetTempFileName()-Funktion bzw. am Temp-Verzeichnis. Mit dem Pfad

    VB.NET-Quellcode

    1. My.Application.Info.DirectoryPath & "\temp.png"

    funktioniert es. Naja, alles muss man ja nicht verstehen^^
    Okay, danke! Genau da lag mein Denkfehler :rolleyes:
    Komisch finde ich aber immernoch, dass er mir als fehlermeldung "Illegales Zeichen im Pfad" sagt und nicht "Die Datei existiert nicht".
    Naja, egal, jetzt funktioniert alles! Danke an alle.

    /Edit: Kann es sein, dass man im Temp-Verzeichnis ohne die Funktion keine Schreibrechte hat? Weil auch dieser Aufruf mit der bekannten Fehlermeldung schiefgeht: System.IO.File.Create(imgfilepath)

    /Edit2: Ich versteh die Welt nicht mehr. Anscheinend hat mein Programm beim Debuggen keinerlei Schreib-/bzw. Administratorrechte. Egal, wo ich eine Datei erstellen will, jedes Mal die gleiche Fehlermeldung.

    /Edit3: ...was aber so auch nicht stimmen kann, weil beim Erstellen der ecs-Datei die ich nachher öffnen will, noch alles klappt... -.- sorry für die ganzen Edits

    /FINALEDIT: So, ich hab den Fehler gefunden! Eigentlich ein Anfängerfehler, und als ich ihn entdeckt hab, hab ich mir an den Kopf gefasst ^^ zB:

    VB.NET-Quellcode

    1. ReDim buffer(4)
    2. filetext.Position = 47
    3. filetext.Read(buffer, 0, 4)
    4. Dim imgformat As String = UTF8Enc.GetString(buffer)
    Ich dimensioniere das Array "buffer" mit 4 als Grenze! Somit habe ich 5 Bytes im im buffer-Array, von denen aber mit der Read-Methode nur 4 "aufgefüllt" werden. FOlglich habe ich bei Position 5 im Array ein illegales Zeichen, wenn ich es in einen String umwandle!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „m477h35“ ()