3 Stimmen

Rekursive Schleifenbildung durch ein Laufwerk und Ersetzen illegaler Zeichen

Ich muss eine Anwendung erstellen, die in ein bestimmtes Laufwerk eindringt, alle Dateinamen liest und illegale SharePoint-Zeichen durch Unterstriche ersetzt. Die illegalen Zeichen, auf die ich mich beziehe, sind: ~ # % & * {} / \ | : <> ? - ""

Kann jemand entweder einen Link zum Code oder den Code selbst zur Verfügung stellen, wie man das macht? Ich bin SEHR neu in C# und brauche alle Hilfe, die ich möglicherweise bekommen kann. Ich habe Code auf rekursiv Bohren durch ein Laufwerk recherchiert, aber ich bin nicht sicher, wie das Zeichen ersetzen und die rekursive Schleife zusammen zu setzen. Bitte helfen Sie!

6voto

Robert Harvey Punkte 173098

Die Hinweise zum Entfernen illegaler Zeichen finden Sie hier:

Wie entfernt man unzulässige Zeichen aus Pfad- und Dateinamen?

Sie müssen nur den Zeichensatz auf die Zeichen ändern, die Sie entfernen möchten.

Wenn Sie herausgefunden haben, wie Sie die Ordner rekursieren können, können Sie alle Dateien in jedem Ordner mit abrufen:

var files = System.IO.Directory.EnumerateFiles(currentPath);

und dann

foreach (string file in files)
{
    System.IO.File.Move(file, ConvertFileName(file));
}

Die ConvertFileName-Methode, die Sie schreiben werden, um einen Dateinamen als String zu akzeptieren und einen Dateinamen zurückzugeben, bei dem die schlechten Zeichen entfernt wurden.

Beachten Sie, dass Sie bei Verwendung von .NET 3.5, GetFiles() funktioniert auch. Laut MSDN:

Die Methoden EnumerateFiles und GetFiles Methoden unterscheiden sich wie folgt: Wenn Sie EnumerateFiles verwenden, können Sie die Aufzählung der Namenssammlung bevor die gesamte Sammlung [ ] müssen Sie warten, bis das gesamte Array der Namen zurückgegeben wird, bevor Sie auf das das Array zugreifen können. Wenn Sie also Arbeit mit vielen Dateien und Verzeichnissen arbeitet, kann EnumerateFiles effizienter sein.


Wie man Verzeichnisse rekursiv auflistet

string path = @"c:\dev";
string searchPattern = "*.*";

string[] dirNameArray = Directory.GetDirectories(path, searchPattern, SearchOption.AllDirectories);

// Or, for better performance:
// (but breaks if you don't have access to a sub directory; see 2nd link below)
IEnumerable<string> dirNameEnumeration = Directory.EnumerateDirectories(path, searchPattern, SearchOption.AllDirectories);

6voto

Steven Punkte 12883

Keine wirkliche Antwort, aber bedenken Sie die beiden folgenden Punkte:

Die folgenden Zeichen sind in Dateinamen ohnehin ungültig, so dass Sie sich um sie keine Sorgen machen müssen: /\:*?"<>| .

Stellen Sie sicher, dass Ihr Algorithmus doppelte Namen angemessen behandelt. Zum Beispiel, My~Project.doc y My#Project.doc würden beide umbenannt werden in My_Project.doc .

2voto

JYelton Punkte 34080

Eine rekursive Methode zum Umbenennen von Dateien in Ordnern ist das, was Sie wollen. Geben Sie einfach den Stammordner an, und es wird sich selbst für alle gefundenen Unterordner aufrufen.

private void SharePointSanitize(string _folder)
{
    // Process files in the directory
    string [] files = Directory.GetFiles(_folder);
    foreach(string fileName in files)
    {
        File.Move(fileName, SharePointRename(fileName));
    }
    string[] folders = Directory.GetDirectories(_folder);
    foreach(string folderName in folders)
    {
        SharePointSanitize(folderName);
    }
}

private string SharePointRename(string _name)
{
    string newName = _name;
    newName = newName.Replace('~', '');
    newName = newName.Replace('#', '');
    newName = newName.Replace('%', '');
    newName = newName.Replace('&', '');
    newName = newName.Replace('*', '');
    newName = newName.Replace('{', '');
    newName = newName.Replace('}', '');
    // .. and so on
    return newName;
}

Anmerkungen:

  1. Sie können die '' en el SharePointRename() Methode auf das Zeichen, das Sie ersetzen möchten, z. B. einen Unterstrich.
  2. Dies prüft nicht, ob zwei Dateien ähnliche Namen haben, wie thing~ und thing%

1voto

hoang Punkte 1827
class Program
{
    private static Regex _pattern = new Regex("[~#%&*{}/\\|:<>?\"-]+");
    static void Main(string[] args)
    {
        DirectoryInfo di = new DirectoryInfo("C:\\");
        RecursivelyRenameFilesIn(di);
    }

    public static void RecursivelyRenameFilesIn(DirectoryInfo root)
    {
        foreach (FileInfo fi in root.GetFiles())
            if (_pattern.IsMatch(fi.Name))
                fi.MoveTo(string.Format("{0}\\{1}", fi.Directory.FullName, Regex.Replace(fi.Name, _pattern.ToString(), "_")));

        foreach (DirectoryInfo di in root.GetDirectories())
            RecursivelyRenameFilesIn(di);
    }
}

Allerdings werden dabei keine doppelten Namen behandelt, wie Steven bereits erwähnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X