Doppelte Ordner mit Inhalt (in Verschiedenen Verzeichnissen) zusammenführen

hallo experten,
ich hoffe (eigentlich weiss ich es) ihr könnt mir helfen.
folgende situation:
ich habe auf laufwerk p dateien in ordnern mit selben namen und mit einem "kommentar als zusatz" in einem "Archiv"-verzeichnis
Beispiel:
p:\=ARCHIV=\10000000 - 10499999\**10000086**\10000086.csv
p:\=ARCHIV=\10000000 - 10499999\**10000086**\10000086 - SP.csv
nun möchte ich schauen bzw suchen ob es den ordner **10000086** schon in einem anderen verzeichnis gibt und den inhalt dann dorthin verschieben sodas die archivverzeichnisse verschwinden bzw in die neue ordnerstruktur intigriert wird
p:\DG 100\
p:\DK 105\
p:\DK 120\
p:\DK 120 UF\
p:\DK 255 F\
p:\DK 400 N\
p:\DK 460 UF\
p:\DK 500 UF\
ich habe hier schon so einiges gefunden aber nicht das richtige für mein problem
ich würde es ja manuell machen. aber bei ca 30000 verzeichnissen suche ich mich dumm und dämlich bzw verschiebe ewigkeiten dateien
noch ein paar details
ordnerstruktur im anhang
doppelte dateien sollen umbenannt werden z.B.: (2)

danke & gruß
slugger
 
schreit nahezu nach einem script oder einem kleinen programm ...

mir ist nur die auflösung des zielordners noch nicht ganz klar ...

mach doch mal ein beispiel anhand einer datei, bei dem man sehen kann welche entscheidungen nötig sind bis feststeht in welchen ordner die datei gehört
 
also nochmal zum besseren verständnis (ich tu mich da immer etwas schwer mit dem erklären)
in erter linie geht es um die verschiebung der gesamten ordner und nicht nur der dateien.

innerhalb der archivordner (ORT A) sind ordner mit einer acht-stelligen nummer (auftragsordner) z.B.: 14064456

diese auftragsordner können auch in einem der den anderen ordnern, welche mit DG oder DK beginnen, vorhanden sein (ORT B)
in diesem fall: dk 460 uf/sobo

wenn der auftragsordner aus ORT A in ORT B vorhanden ist, dann soll der inhalt von A nach B verschoben und nicht nur kopiert werden, demzufolge auch auf A nicht mehr vorhanden sein.

doppelte dateien sollen automatisch umbenannt und nicht überschieben werden.

sollte der ordner nicht vorhanden sein dann wird nichts verschoben und der nächste ordner soll überprüft werden

meine güte ist das kompliziert zu erklären
ich hoffe es kommt einigermaßen verständlich rüber

gruß
slugger
 
Zuletzt bearbeitet:
also ... du hast einen ort a (archiv) der ordner enthält ... diese ordner enthalten unterordner mit numerischen namen (auftragsnummern)

nun soll ein ort b geprüft werden ob in der verzeichnis hierachie unterhalb von b eine gleiche numerische enstprechung für die ordner existiert, und falls ja sollen die dateien und unterodrner (ort a; auftragsnummer) dorthin migriert werden. doppelte dateien die bei der migration zu kollisionen führen sollen eindeutige namen bekommen ...


was soll passieren wenn die auftragsnummer in mehreren unterordnern der neuen struktur auftaucht?

wenn du die daten verschiebst, muss dir klar sein, dass falls das programm/script nicht das tut was du willst, du vor einem berg unübersichtlicher daten sitzt. sicher dass du keine kopie der quelle willst? oder muss ggf ein protokoll her anhand dessen man das ganze zurück rollen kann?

da das ganze offensichtlich komerziell ist, wie stehts mit deiner preisvorstellung?
 
also ... du hast einen ort a (archiv) der ordner enthält ... diese ordner enthalten unterordner mit numerischen namen (auftragsnummern)

nun soll ein ort b geprüft werden ob in der verzeichnis hierachie unterhalb von b eine gleiche numerische enstprechung für die ordner existiert, und falls ja sollen die dateien und unterodrner (ort a; auftragsnummer) dorthin migriert werden. doppelte dateien die bei der migration zu kollisionen führen sollen eindeutige namen bekommen ...
korrekt


was soll passieren wenn die auftragsnummer in mehreren unterordnern der neuen struktur auftaucht?
kommt nicht vor

wenn du die daten verschiebst, muss dir klar sein, dass falls das programm/script nicht das tut was du willst, du vor einem berg unübersichtlicher daten sitzt. sicher dass du keine kopie der quelle willst? oder muss ggf ein protokoll her anhand dessen man das ganze zurück rollen kann?
ist mir bewusst aber das würde ich eh testen auf nem anderen laufwerk mit einer kopie der verzeichnisse, also brauch es keine rollbackfunktion

da das ganze offensichtlich komerziell ist, wie stehts mit deiner preisvorstellung?
sorry. wenn es dir um geld geht dann kann ich dir leider nichts bieten.
 
so ... ich war so frei mich ein wenig mit dem problem zu beschäftigen und hab dir folgendes gebastelt...

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DirectoryTreeMerge
{
    class Program
    {
        //static string sourcePath = @"P:\=ARCHIV=\";
        static string sourcePath = @"d:\test-src\";
        static string targetPath = @"d:\";
        static string sourcePattern = "[0-9]{8}"; //zeichen für den verzeichnisnamen ... zeichen von 0-9 ... exakt 8 stück

        static void Main(string[] args)
        {
          
            var sourceDir = new System.IO.DirectoryInfo(sourcePath);

            if (!sourceDir.Exists)
                throw new Exception(String.Format("FUUUUUU ... das Source Verzeichnis \"{0}\" existiert nicht", sourcePath));

            foreach (var subDir in sourceDir.EnumerateDirectories())
            {
                var validSubSubDirs = subDir.EnumerateDirectories().Where(x => System.Text.RegularExpressions.Regex.IsMatch(x.Name, sourcePattern));
                foreach (var validSubSubDir in validSubSubDirs)
                {
                    tryMoveSource(validSubSubDir);
                }
            }
        }

        private static void tryMoveSource(System.IO.DirectoryInfo source)
        {
            var targetDir = new System.IO.DirectoryInfo(targetPath);
            var candidateTargetSubDirs = targetDir.EnumerateDirectories(source.Name, System.IO.SearchOption.AllDirectories);
            var validTargetSubDirs = candidateTargetSubDirs.Where(x => !(x.FullName.ToLowerInvariant().StartsWith(sourcePath.ToLowerInvariant())));
            if (validTargetSubDirs.Count() > 1)
                throw new Exception(string.Format("FUUUUUU ... Auftragsnummer {0} gibts mehmals in der Zielverzeichnisstruktur: {1}", source.Name, String.Join(" ; ", validTargetSubDirs.Select(x => x.FullName))));
            else if (validTargetSubDirs.Count() == 1)
                migrate(source, validTargetSubDirs.First());
        }

        private static void migrate(System.IO.DirectoryInfo source, System.IO.DirectoryInfo target)
        {
            var dirs = source.EnumerateDirectories();
            var files = source.EnumerateFiles();
            foreach (var file in files)
                migrateFile(file, target);
            foreach (var dir in dirs)
                migrateDir(dir, target);
        }

        private static void migrateDir(System.IO.DirectoryInfo dir, System.IO.DirectoryInfo target)
        {
            var tdirs=target.EnumerateDirectories(dir.Name);
            if (tdirs.Count()==1)
            {
                migrate(dir, tdirs.First());
            }
            else
            {
                var tdir = new System.IO.DirectoryInfo(String.Format(@"{0}\{1}", target.FullName, dir.Name));
                tdir.Create();
                migrate(dir, tdir);
            }
        }

        private static void migrateFile(System.IO.FileInfo file, System.IO.DirectoryInfo target)
        {
            var baseFilename = getBaseFilename(file);
            var ext = file.Extension;
            var destFileName = String.Join(@"\", target.FullName, file.Name);
            if (System.IO.File.Exists(destFileName))
            {
                var collisions = target.EnumerateFiles().Where(x => x.Name == String.Format("{0}{1}", baseFilename, ext) || System.Text.RegularExpressions.Regex.IsMatch(x.Name, string.Format("{0} \\([0-9]+\\){1}", baseFilename, ext))).ToArray();
                if (collisions.Length > 0)
                {
                    destFileName = String.Join(@"\", target.FullName, getCollisionFreeName(baseFilename, ext, collisions));
                }
            }
            if (!System.IO.File.Exists(destFileName))
                file.MoveTo(destFileName);
            else
                throw new Exception("Failed to create unique destFileName");
        }

        private static string getCollisionFreeName(string baseFilename, string ext, System.IO.FileInfo[] collisions)
        {
            int idx=2;
            string ret;
            do
            {
                ret = string.Format("{0} ({1}){2}", baseFilename, idx++, ext);
            } while (collisions.Any(x => x.Name == ret));
            return ret;
        }

        private static string getBaseFilename(System.IO.FileInfo file)
        {
            var baseFilename = file.Name;
            baseFilename = baseFilename.Remove(file.Name.Length - file.Extension.Length);
            var m = System.Text.RegularExpressions.Regex.Match(baseFilename, @"^(.*) \([0-9]+\)$");
            if (m.Success)
            {
                baseFilename = m.Groups[1].Value;
            }
            return baseFilename;
        }
    }
}

oberfläche gibbet nüsch, konfiguration erfolgt über statische variablen ganz am anfang, und du wirst dich mit visual studio oder einem c# compiler auseinandersetzen müssen ;)

garantien gibts natürlich auch keine

für komerzielle geschichten kostet sowas für gewöhnlich ... also freu dich du hast folgende geschätzte kosten gespart:

arbeitsaufwand bis hier hin: ca 1h

weiterer geschätzter arbeitsaufwand für eine oberfläche ~ 15m
weiterer geschätzter aufwand für tests ~ 2h
rüstzeit pauschal 30m

gerundet auf volle stunden 4h ==> 4h/8h => halber tag => 0,5*800EUR => 400 EUR + märchensteuer
 
Zurück
Oben