Array Größe VB.NET

  • VB.NET

Es gibt 34 Antworten in diesem Thema. Der letzte Beitrag () ist von DoubleX.

    Array Größe VB.NET

    Hallo zusammen,

    nochmal eine Frage:

    es geht wieder um den Converter .doc in .docx.

    Hab en Array in dem jede Datei mit Pfad aufgelistet wird und die werden nacheinander umgewandelt. Wenn ich nun eine gewisse Anzahl an Dateien erreiche (204 Dateien) dann bekomme ich einen Dateifehler. Kanns daran liegen, dass die max. Arraygröße erreicht ist?

    Kann ich das ganze anders speichern? Wenn ja, wie am besten? Wird als string gespeichert und bekanntlichermaßen braucht ein String viel Speicher.

    Danke im voraus!

    MfG
    DoubleX
    Mit dem Dateifehler kann wahrscheinlich niemand was anfangen. Kann von der Arbeit auch keine Bildupload-Seite öffnen ;)

    Da steht einfach nur Dateifehler: und dann der Pfad der Datei.


    Das Programm läuft nicht in eine Exception und läuft weiter jedoch werden dann die darauf folgenden Dateien nicht umgewandelt.
    Ist immer eine andere, aber immer nach 204 Dateien.


    ich frage die Dateien im Verzeichnis mit GetFiles. Wie funktioniert das mit List (Of T) ?

    hier mal ein Codesnipet:


    VB.NET-Quellcode

    1. For Each dateienword As String In
    2. My.Computer.FileSystem.GetFiles(zielpfad, FileIO.SearchOption.SearchAllSubDirectories, "*.doc")
    3. dateinameWord = IO.Path.GetFileName(dateienword)
    4. If (dateinameWord.EndsWith(".doc") = True) Then
    5. dateinameWord = dateinameWord.Replace(".doc", ".docx")
    6. pfadWord = IO.Path.GetDirectoryName(dateienword)
    7. newpfad = pfadWord & "\" & dateinameWord
    8. Dim worddoc = objWDApp.Documents.Open(dateienword)
    9. worddoc.SaveAs2(FileName:=newpfad, FileFormat:=WdSaveFormat.wdFormatDocumentDefault, CompatibilityMode:=WdCompatibilityMode.wdWord2010)
    10. worddoc.Close()
    11. worddoc = Nothing
    12. System.IO.File.Delete(dateienword)



    Danke!

    MfG
    DoubleX

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DoubleX“ ()

    GetFiles liefert doch eine Auflistung der Dateien in Verzeichnis xy oder nicht?

    Dann ist die Dateisuche doch nach diesem Aufruf beendet und mit der Foreach schleife durchlaufe ich diese liste und greife jedes element auf... oder habe ich da nen denkfehler?
    Vielleicht solltest du dir auch mal das Disposing ansehen. grad wenn du mit Dateien arbeitest.

    VB.NET-Quellcode

    1. Using myFile as FileReader = IO.File.Open(fileName)
    2. ' do something
    3. End Using


    Was ich mir denken könnte (wenn auch unwahrscheinlich), du lädst Daten, sie stehen im Arbeitsspeicher. Das using gewährleistet, dass sie das nur tun solange du sie brauchst...
    Obwohl da eher irgendwann eine StackOverflowException oder ähnliches zu erwarten wäre... vielleicht trotzdem mal schauen.

    IDisposable
    Using Statement
    :) wie kann ich das ganze denn mit List(of) verwirklichen?
    muss doch auf jeden fall die GetFiles-Abfrage starten um die ganzen Dateien zu erhalten.

    Aber mir is grad eingefallen, dass es eigtl nicht an der mangelnden Größe vom Array liegen kann.
    Zu einem früheren Zeitpunkt im Programm hab ich folgende Abfrage und in der befüllten CheckedListBox finden sich dann alle (in diesem Fall) 931 Dateien wieder.


    VB.NET-Quellcode

    1. For Each dateien As String In
    2. My.Computer.FileSystem.GetFiles(quellpfad, FileIO.SearchOption.SearchAllSubDirectories, "*.doc", "*.xls")
    3. If (dateien.EndsWith(".doc") = True) Then
    4. CheckedListBox1.Items.Add(dateien)
    5. anzahl = anzahl + 1
    6. ElseIf (dateien.EndsWith(".xls") = True) Then
    7. CheckedListBox1.Items.Add(dateien)
    8. anzahl = anzahl + 1
    9. End If
    10. Next


    warum kann ich eigtl nicht den ganzen Code auf einmal einfügen?
    Der wird dann immer aneinander gereiht wenn ich den dann anschließen in [vb] setze... nervig :/
    List(Of T) hat sicher nix damit zu tun.

    Resourcenbereinigung mit ComObjekte geht anners, und ist sehr prekär.

    VB.NET-Quellcode

    1. Private Sub SomethingWired(ByVal zielpfad As String)
    2. For Each fi In New DirectoryInfo(zielpfad).GetFiles("*.doc", SearchOption.AllDirectories)
    3. Dim worddoc = objWDApp.Documents.Open(fi.FullName)
    4. worddoc.SaveAs2(FileName:=fi.FullName & "x", FileFormat:=WdSaveFormat.wdFormatDocumentDefault, CompatibilityMode:=WdCompatibilityMode.wdWord2010)
    5. worddoc.Close()
    6. System.Runtime.InteropServices.Marshal.FinalReleaseComObject(worddoc)
    7. fi.Delete()
    8. Next
    9. End Sub



    warum kann ich eigtl nicht den ganzen Code auf einmal einfügen?
    Der wird dann immer aneinander gereiht wenn ich den dann anschließen in [vb] setze... nervig :/
    wer lesen kann ist klar im Vorteil: VB-Tag richtig benutzen

    VB.NET-Quellcode

    1. dim list as new List(Of TypeName)
    2. list.Add(element)
    3. list.Remove(element)
    4. list.RemoveAt(elementId)
    5. list(id) = something
    6. something = list(id)
    7. ...


    ansonsten:

    VB.NET-Quellcode

    1. For Each dateien As String In
    2. My.Computer.FileSystem.GetFiles(quellpfad, FileIO.SearchOption.SearchAllSubDirectories, "*.doc", "*.xls")
    3. If (dateien.EndsWith(".doc") = True) Then
    4. CheckedListBox1.Items.Add(dateien)
    5. anzahl = anzahl + 1
    6. ElseIf (dateien.EndsWith(".xls") = True) Then
    7. CheckedListBox1.Items.Add(dateien)
    8. anzahl = anzahl + 1
    9. End If
    10. Next


    is das selbe wie:

    VB.NET-Quellcode

    1. For Each dateien As String In My.Computer.FileSystem.GetFiles(quellpfad, FileIO.SearchOption.SearchAllSubDirectories, "*.doc", "*.xls")
    2. CheckedListBox1.Items.Add(dateien)
    3. anzahl = anzahl + 1
    4. ' 1. Er lädt nur die Dateien die du willst
    5. ' 2. If something = True ist das selbe wie If something
    6. ' ersteres ist nur länger in der Ausführung und unübersichtlicher
    7. Next

    ErfinderDesRades schrieb:

    List(Of T) hat sicher nix damit zu tun.

    Resourcenbereinigung mit ComObjekte geht anners, und ist sehr prekär.

    VB.NET-Quellcode

    1. Private Sub SomethingWired(ByVal zielpfad As String)
    2. For Each fi In New DirectoryInfo(zielpfad).GetFiles("*.doc", SearchOption.AllDirectories)
    3. Dim worddoc = objWDApp.Documents.Open(fi.FullName)
    4. worddoc.SaveAs2(FileName:=fi.FullName & "x", FileFormat:=WdSaveFormat.wdFormatDocumentDefault, CompatibilityMode:=WdCompatibilityMode.wdWord2010)
    5. worddoc.Close()
    6. System.Runtime.InteropServices.Marshal.FinalReleaseComObject(worddoc)
    7. fi.Delete()
    8. Next
    9. End Sub





    Bist du sicher, dass das so funktioniert?
    Habs mal abgeändert nach deinen Vorschlägen und bekomme folgende Fehlermeldung:

    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    Fehler gefunden...

    hatte in Zeile 3 .FullName vergessen... ;)

    Teste grad nochmal mit 931 Dateien.... dauert etwas. Hab um 5 Feierabend.

    Falls ich noch Fragen habe schreib ich morgen nochmal.

    Schonmal vielen Dank!

    Wieder was dazu gelernt.

    MfG
    DoubleX