777 Stimmen

Umbenennen einer Datei in C#

Wie kann ich eine Datei mit C# umbenennen?

2 Stimmen

Ich würde ungern hinzufügen, dass es ein Problem hier alle Lösungen hier vor allem, wenn Sie tun, vergleicht und verschieben die Datei von einem Speicherort zu einem anderen (Verzeichnis sowie Dateiname) insofern, als Sie sollten sich bewusst sein, dass ein Datenträger ein Knotenpunkt sein könnte... also wenn newname ist q: \SomeJunctionDirectory\hello.txt und der alte Name ist c: \TargetOfJunctionPoint\hello.txt... Die Dateien sind identisch, aber die Namen sind es nicht.

23voto

Ray Punkte 233
  1. Erste Lösung

    Vermeiden Sie System.IO.File.Move hier eingestellte Lösungen (einschließlich markierter Antwort). Es funktioniert nicht über Netzwerke. Das Muster Kopieren/Löschen funktioniert jedoch lokal und über Netzwerke. Befolgen Sie eine der Lösungen zum Verschieben, aber ersetzen Sie sie stattdessen durch Kopieren. Verwenden Sie dann File.Delete, um die Originaldatei zu löschen.

    Zur Vereinfachung können Sie eine Rename-Methode erstellen.

  2. Benutzerfreundlichkeit

    Verwenden Sie die VB-Assembly in C#. Referenz zu Microsoft.VisualBasic hinzufügen

    Dann benennen Sie die Datei um:

    Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(myfile, newName);

    Beides sind Strings. Beachten Sie, dass myfile den vollständigen Pfad enthält, newName jedoch nicht. Zum Beispiel:

    a = "C:\whatever\a.txt";
    b = "b.txt";
    Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(a, b);

    El C:\whatever\ Ordner enthält nun b.txt .

12 Stimmen

Nur damit Sie es wissen: Microsoft.VisualBasic.FileIO.FileSystem.RenameFile ruft File.Move auf. Neben der Normalisierung der Originaldatei und der Durchführung einiger zusätzlicher Fehlerprüfungen für die Argumente (z. B. Datei existiert, Dateiname nicht null usw.) ruft es dann File.Move auf.

0 Stimmen

Solange Copy() nicht alle Dateiströme kopiert, wovon ich ausgehe, dass es das nicht tut, würde ich von der Verwendung von delete/copy Abstand nehmen. Ich nehme an, dass Move(), zumindest wenn es im selben Dateisystem bleibt, einfach ein Umbenennen ist und somit alle Dateiströme erhalten bleiben.

0 Stimmen

"über das Netzwerk fehlschlägt", dann werden Sie kopieren und löschen, was eigentlich ein Herunter- und Hochladen ist, nur aus Gründen der Bequemlichkeit beim Codieren... Welche Art von Netzwerk? Windows-Freigabeordner ( smb ), ftp , ssh oder was auch immer haben alle Befehle/Primitive für das Verschieben/Umbenennen von Dateien, es sei denn, dies ist nicht erlaubt (z. B. schreibgeschützt).

17voto

Zaki Choudhury Punkte 1447

Sie können sie als neue Datei kopieren und dann die alte Datei mit dem Befehl System.IO.File Klasse:

if (File.Exists(oldName))
{
    File.Copy(oldName, newName, true);
    File.Delete(oldName);
}

5 Stimmen

Hinweis an alle, die dies lesen: Dies ist ein Anti-Pattern, die Datei könnte von einem anderen Prozess oder dem Betriebssystem zwischen der Prüfung, ob sie existiert, und dem Aufruf von Copy gelöscht oder umbenannt werden. Sie müssen stattdessen einen Try-Catch verwenden.

0 Stimmen

Wenn der Datenträger derselbe ist, ist dies auch eine enorme Verschwendung von E/A, da eine Verschiebung tatsächlich eine Umbenennung auf der Ebene der Verzeichnisinformationen vornehmen würde.

0 Stimmen

Ich verarbeite Tausende von Dateien und habe den Eindruck, dass Kopieren/Löschen schneller ist als Verschieben.

12voto

Majedur Punkte 2282
public void RenameFile(string filePath, string newName)
{
    FileInfo fileInfo = new FileInfo(filePath);
    fileInfo.MoveTo(fileInfo.Directory.FullName + "\\" + newName);
}

1 Stimmen

Können Sie erklären, inwiefern sich dies von den anderen Antworten unterscheidet oder relevant ist?

1 Stimmen

@Stefan Ich habe es einfach zu einer sauberen und wiederverwendbaren Methode gemacht. So können Sie es mit minimalen Abhängigkeiten verwenden.

8voto

MicRoc Punkte 117

HINWEIS: In diesem Beispielcode öffnen wir ein Verzeichnis und suchen nach PDF-Dateien mit offenen und geschlossenen Klammern im Namen der Datei. Sie können jedes beliebige Zeichen im Namen prüfen und ersetzen oder mit den Ersetzungsfunktionen einen ganz neuen Namen angeben.

Es gibt andere Möglichkeiten, mit diesem Code zu arbeiten, um aufwändigere Umbenennungen vorzunehmen, aber ich wollte vor allem zeigen, wie man mit File.Move eine Stapelumbenennung vornimmt. Dies funktionierte mit 335 PDF-Dateien in 180 Verzeichnissen, als ich es auf meinem Laptop ausführte. Dies ist ein spontaner Code, und es gibt ausgefeiltere Möglichkeiten, dies zu tun.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BatchRenamer
{
    class Program
    {
        static void Main(string[] args)
        {
            var dirnames = Directory.GetDirectories(@"C:\the full directory path of files to rename goes here");

            int i = 0;

            try
            {
                foreach (var dir in dirnames)
                {
                    var fnames = Directory.GetFiles(dir, "*.pdf").Select(Path.GetFileName);

                    DirectoryInfo d = new DirectoryInfo(dir);
                    FileInfo[] finfo = d.GetFiles("*.pdf");

                    foreach (var f in fnames)
                    {
                        i++;
                        Console.WriteLine("The number of the file being renamed is: {0}", i);

                        if (!File.Exists(Path.Combine(dir, f.ToString().Replace("(", "").Replace(")", ""))))
                        {
                            File.Move(Path.Combine(dir, f), Path.Combine(dir, f.ToString().Replace("(", "").Replace(")", "")));
                        }
                        else
                        {
                            Console.WriteLine("The file you are attempting to rename already exists! The file path is {0}.", dir);
                            foreach (FileInfo fi in finfo)
                            {
                                Console.WriteLine("The file modify date is: {0} ", File.GetLastWriteTime(dir));
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.Read();
        }
    }
}

3 Stimmen

Das ist... völlig nebensächlich, zu einer Frage, die vor 3 Jahren genau auf den Punkt beantwortet wurde.

3 Stimmen

Das ist ein gutes Beispiel. Overkill vielleicht, aber nicht neben der Sache. +1

1 Stimmen

@Adam: Es handelt sich um eine sehr spezifische Umsetzung genau der Antwort, die bereits drei Jahre zuvor gegeben wurde, und zwar auf eine Frage, bei der es in erster Linie nicht um eine spezifische Umsetzung ging. Ich verstehe nicht, wie das in irgendeiner Weise konstruktiv sein soll.

7voto

Adil H. Raza Punkte 1387

In keiner der Antworten wird erwähnt, dass eine unit-testbare Lösung geschrieben wurde. Sie könnten verwenden System.IO.Abstractions da es einen testbaren Wrapper um FileSystem-Operationen herum bietet, mit dem man ein Mocked File System-Objekt erstellen und Unit-Tests schreiben kann.

using System.IO.Abstractions;

IFileInfo fileInfo = _fileSystem.FileInfo.FromFileName("filePathAndName");
fileInfo.MoveTo(Path.Combine(fileInfo.DirectoryName, newName));

Es wurde getestet, und es funktioniert der Code zum Umbenennen einer Datei.

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