MoveDirectory

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Sam85.

    MoveDirectory

    Hallöchen,

    hatte jetzt eine länger VB Pause und wollte jetzt mal wieder was machen.

    Frage:
    Ich versuche alle Unterordner in einem Ordner zu verschieben (von Local auf Server). Relativ trivial dachte ich...nun bin ich soweit, dass alles verschoben wird, nur leider auch das Stammverzeichnis in dem gesucht wird.
    Kann ich das verhindern? Aktuell lass ich das Verzeichnis einfach neu erstellen, dachte aber es geht doch bestimmt auch anders.

    PS: Nicht wundern wegen der Verzeichnis Angabe, ich ändere damit eine Zeile in einer .ini Datei.

    Freue mich über eine Rückmeldung.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim PathExtern As String = "CUSTOMERS=.\customers"
    2. Dim PathIntern As String = "CUSTOMERS=\\myshoes\customers"
    3. Dim PathMoveFolders As String = "C:/myshoes/"
    4. Dim s As String = Strings.Split(PathIntern, "="c)(1) & "\"
    5. Dim p As String = Path.Combine(PathMoveFolders, "customers/")
    6. For Each fo As String In Directory.GetDirectories(PathMoveFolders, "*", SearchOption.TopDirectoryOnly)
    7. My.Computer.FileSystem.MoveDirectory(fo, s)
    8. IO.Directory.CreateDirectory(p)
    9. Next fo

    @RodFromGermany

    Das habe ich versucht kann aber nicht von Local auf den Server verschieben. ("Das Ziel darf kein anderes Datenträgervolumen haben.")
    Wie gesagt das verschieben mit

    Quellcode

    1. My.Computer.FileSystem.MoveDirectory
    funktioniert damit, nur ich will verhindern, dass das Stammverzeichnis mit kopiert wird.

    Bsp.:

    C:\myshoes\customers\Heinz\Bilder -> \\server\customers\Heinz\bilder

    Wobei nur ab dem Verzeichnis Heinz kopiert werden soll und nicht das Stammverzeichnis "customers".

    Sam85 schrieb:

    nur ich will verhindern, dass das Stammverzeichnis mit kopiert wird.
    Worin genau besteht das Problem?
    Was würdest Du im Explorer machen, um das durchzuführen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wobei nur ab dem Verzeichnis Heinz kopiert werden soll und nicht das Stammverzeichnis "customers".

    VB.NET-Quellcode

    1. Dim PathExtern As String = "CUSTOMERS=.\customers"
    2. Dim PathIntern As String = "CUSTOMERS=\\myshoes\customers"
    3. Dim PathMoveFolders As String = "C:/myshoes/"
    4. Dim s As String = Strings.Split(PathIntern, "="c)(1) & "\"
    5. Dim p As String = Path.Combine(PathMoveFolders, "customers\")
    6. For Each fo As String In Directory.GetDirectories(p, "*", SearchOption.TopDirectoryOnly)
    7. My.Computer.FileSystem.MoveDirectory(fo, s)
    8. IO.Directory.CreateDirectory(p)
    9. Next fo
    na - siehst du den Unterschied?
    Ich würde ausschneiden und einfügen. Wie gesagt das passiert ja auch...ich dachte nur das wenn ich TopDirectoryOnly setzt, auch nur das TopDirectory betrachtet wird.
    Oder sehe ich das falsch?

    C:/myshoes/customers/heinz/a
    C:/myshoes/customers/heinz/b

    Mein TopDirectory ist doch "heinz" wenn ich in "C:/myshoes/customers/" suche oder?

    @ErfinderDesRades das eine "p" statt "PathMoveFolders" und ein "/" statt "\"?
    Wenn ich das mache passiert folgendes: Es werden nur a und b aus dem Verzeichnis "Heinz" verschoben. Kann ich auch nur "Heinz" als Ganzes verschieben?

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Sam85“ ()

    Kurze Zwischenfragen (der Code in Post#1 hat es tatsächlich geschafft, dass ich 3x drüber nachdenken musst, was da passiert. VB6 und ungünstige Variablennamen sei dank):
    Warum versuchst Du in der Schleife in Post#1, Zeile#10 p immer wieder neu zu erstellen?
    Und warum mal Backslashes und mal Slashes (Z#3)
    Und wozu braucht man in dem Code PathExtern?

    btw:
    Strings.Split(PathIntern, "="c)(1) & "\" ist VB6 -> Split(PathIntern.Split("="c)(1) & "\"
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    VB.NET-Quellcode

    1. Dim EntryInIPathForExtern As String = "CUSTOMERS=.\customers"
    2. Dim EntryInIPathForIntern As String = "CUSTOMERS=\\SERVER\myshoes\customers"
    3. Dim PathIniFileLocal As String = "C:/myshoes/myshoes.ini"
    4. Dim PathMoveFoldersFromLocal As String = "C:/myshoes/"


    So sieht es bei mir aus. Die oberen beiden Einträge sind in der .INI.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub ChangeIniEntry(ByVal fp As FilePath)
    2. Dim fi As String() = IO.File.ReadAllLines(PathIniFileLocal)
    3. Select Case fp
    4. Case FilePath.pIn
    5. fi(8) = EntryInIPathForIntern
    6. Case FilePath.pEx
    7. fi(8) = EntryInIPathForExtern
    8. End Select
    9. IO.File.WriteAllLines(PathIniFileLocal, fi)
    10. End Sub


    Ist aber nicht relevant, den Eintrag kann ich auch nur anpassen.

    Wenn du mir jetzt noch sagen kannst wie ich die "Split" in VB .net schreibe :D dann kann ich den Ranz entfernen.

    zu 1. In Post #1 war es so, dass das Stammverzeichnis mit verschoben wurde, daher musste ich es da wo es vorher war neu erstellen.
    zu 2. Die Slahes stehen so in der .ini. Auf UNC so "\\" und sonst "C:/" warum der Hersteller .\customers geschrieben hat...vmtl. damit es sich auf das Progammverzeichnis bezieht.
    zu 3. Die Kollegen fahren mit dem Laptop zu den Kunden und hab dann keine Zugriff mehr auf die Domäne wo die Daten liegen. Daher muss ich in der ini. die Pfad anpassen damit die Daten Lokal gespeichert werden und kommen die dann wieder in die Firma, werden die Daten auf dem Server abgelegt. Sicher Datenbankhaltung geht anders :) aber das ist nicht meine Baustelle.

    Btw. Ich hab die Benamung angepasst, vielleicht ist es dann besser verständlich.

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

    Sam85 schrieb:

    Wenn du mir jetzt noch sagen kannst wie ich die "Split" in VB .net schreibe dann kann ich den Ranz entfernen.

    Hab ich doch in Post#7 … aber falsch :S
    korrekt ist natürlich
    PathIntern.Split("="c)(1) & "\"
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Danke ist geändert. Dennoch wie komme ich weiter? Es werden auch so statt dem Ursprungsverzeichnis nur dessen Unterverzeichnisse verschoben. Muss ich an einer anderen Stelle das Move ausführen? ?(

    VB.NET-Quellcode

    1. Private Sub ExportFolders()
    2. Dim s As String = EntryInIPathForIntern.Split("="c)(1) & "\"
    3. Dim p As String = Path.Combine(PathMoveFoldersFromLocal, "customers/")
    4. For Each fo As String In Directory.GetDirectories(p, "*", SearchOption.TopDirectoryOnly)
    5. My.Computer.FileSystem.MoveDirectory(fo, s)
    6. 'IO.Directory.CreateDirectory(p)
    7. Next fo
    8. End Sub


    PS:
    Dim p As String = Path.Combine(PathMoveFoldersFromLocal) mach ich das nur so, wird es richtig übertragen aber mein customers Verzeichnis auf C:/ verschwindet mit.
    Bilder
    • Ursprung auf C.PNG

      5,09 kB, 334×170, 68 mal angesehen
    • Move.PNG

      5,77 kB, 453×114, 66 mal angesehen
    Du gehst m.E. das Ganze insofern falsch an, weil Du auf Code aufbaust, den Du anscheinend nicht ganz ablauftechnisch erfasst. Und ich auch nicht, aber wurscht. Fang doch mal mit was ganz Einfachem an und werd dann später genereller. Aber solange Du nicht weißt, was genau passiert, ist es kontraproduktiv, das Ganze zum Laufen zu bringen.

    Ich habe: D:\myshoes\customers\heinz mit dessen Unterverzeichnissen 1 und 2
    Wenn ich das jetzt verschieben will, sodass Heinz im Verzeichnis D:\Ziel ist (inkl. den Unterverzeichnissen von Heinz), dann reicht

    VB.NET-Quellcode

    1. My.Computer.FileSystem.MoveDirectory("D:\myshoes\customers\Heinz", "D:\Ziel\Heinz")

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Dann versuche ich den Ablauf mal festzuhalten.
    1. Ich habe Verzeichnisse Lokal auf C:

    Quellcode

    1. For Each fo As String In Directory.GetDirectories(p, "*", SearchOption.TopDirectoryOnly)


    p = "C:/myshoes/"

    In dem Verzeichnis ist der Unterordner "Heinz".

    2. Diese Verzeichnisse auf C: sollen auf den Server verschoben werden

    Quellcode

    1. My.Computer.FileSystem.MoveDirectory(fo, s)


    fo = C:/myshoes/customers
    s = \\SERVER\myshoes\customers\

    Es wird das "customers" Verzeichnis von "C:/myshoes/" auf den "\\SERVER\\myshoes\customers" verschoben. Das Ergebnis stimmt, nur das "customers" Verzeichnis auf "C:/myshoes/" ist mit verschoben, statt nur die Unterordner. Wie gestalte ich es also so, dass nur die Unterordner von "C:/myshoes/customers/" verschoben werden?

    EDIT:
    Danke für den Wink mit dem Zaunpfahl

    VB.NET-Quellcode

    1. Private Sub ExportFolders()
    2. Dim s As String = EntryInIPathForIntern.Split("="c)(1) & "\"
    3. Dim p As String = Path.Combine(PathMoveFoldersFromLocal, "customers/")
    4. For Each fo As String In Directory.GetDirectories(p, "*", SearchOption.TopDirectoryOnly)
    5. s = Path.Combine(s, fo.Split("/"c)(3))
    6. My.Computer.FileSystem.MoveDirectory(fo, s)
    7. Next fo
    8. End Sub

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