web-dev-qa-db-ja.com

C#でファイルの名前を変更する

C#を使用してファイルの名前を変更する方法

551
Gold

System.IO.File.Move を見て、ファイルを新しい名前に "移動"してください。

System.IO.File.Move("oldfilename", "newfilename");
850
Chris Taylor
System.IO.File.Move(oldNameFullPath, newNameFullPath);
121

File.Move を使うことができます。

39
Franci Penov

File.Moveメソッドでは、ファイルが既に存在していても、これは上書きされません。そしてそれは例外を投げます。

そのため、ファイルが存在するかどうかを確認する必要があります。

/* Delete the file if exists, else no exception thrown. */

File.Delete(newFileName); // Delete the existing file if exists
File.Move(oldFileName,newFileName); // Rename the oldFileName into newFileName

または例外を避けるためにtry catchで囲みます。

38
Mohamed Alikhan

追加するだけです:

namespace System.IO
{
    public static class ExtendedMethod
    {
        public static void Rename(this FileInfo fileInfo, string newName)
        {
            fileInfo.MoveTo(fileInfo.Directory.FullName + "\\" + newName);
        }
    }
}

その後...

FileInfo file = new FileInfo("c:\test.txt");
file.Rename("test2.txt");
27
Nogro
  1. 最初の解決策

    ここに投稿されたSystem.IO.File.Moveソリューションを避けてください(マークされた答えが含まれています)。ネットワーク経由でフェイルオーバーします。ただし、コピー/削除パターンはローカルでもネットワーク上でも機能します。移動方法の1つに従ってください、しかし代わりにコピーでそれを取り替えてください。次にFile.Deleteを使って元のファイルを削除します。

    簡単にするためにRenameメソッドを作成できます。

  2. 使いやすさ

    C#ではVBアセンブリを使用してください。 Microsoft.VisualBasicへの参照を追加

    次にファイルの名前を変更します。

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

    どちらも文字列です。 myfileはフルパスです。 newNameは違います。例えば:

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

    C:\whatever\フォルダにb.txtが含まれるようになります。

20
Ray

これを新しいファイルとしてコピーしてから、System.IO.Fileクラスを使用して古いファイルを削除できます。

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

注: このサンプルコードでは、ディレクトリを開き、ファイル名に開き括弧と閉じ括弧を付けてPDFファイルを検索します。あなたはあなたが好きな名前の中の任意の文字をチェックして置き換えるか、単にreplace関数を使って全く新しい名前を指定することができます。

このコードからさらに複雑な名前の変更を行う方法は他にもありますが、私の主な目的は、File.Moveを使用してバッチの名前変更を行う方法を示すことでした。私のラップトップでそれを実行したとき、これは180のディレクトリの335のPDFファイルに対して機能しました。これは、瞬間コードの拍車であり、それを実行するためのより複雑な方法があります。

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();
        }
    }
}
6
MicRoc

つかいます:

using System.IO;

string oldFilePath = @"C:\OldFile.txt"; // Full path of old file
string newFilePath = @"C:\NewFile.txt"; // Full path of new file

if (File.Exists(newFilePath))
{
    File.Delete(newFilePath);
}
File.Move(oldFilePath, newFilePath);
5
Avinash Singh

うまくいけば!それはあなたにとって役に立つでしょう。 :)

  public static class FileInfoExtensions
    {
        /// <summary>
        /// behavior when new filename is exist.
        /// </summary>
        public enum FileExistBehavior
        {
            /// <summary>
            /// None: throw IOException "The destination file already exists."
            /// </summary>
            None = 0,
            /// <summary>
            /// Replace: replace the file in the destination.
            /// </summary>
            Replace = 1,
            /// <summary>
            /// Skip: skip this file.
            /// </summary>
            Skip = 2,
            /// <summary>
            /// Rename: rename the file. (like a window behavior)
            /// </summary>
            Rename = 3
        }
        /// <summary>
        /// Rename the file.
        /// </summary>
        /// <param name="fileInfo">the target file.</param>
        /// <param name="newFileName">new filename with extension.</param>
        /// <param name="fileExistBehavior">behavior when new filename is exist.</param>
        public static void Rename(this System.IO.FileInfo fileInfo, string newFileName, FileExistBehavior fileExistBehavior = FileExistBehavior.None)
        {
            string newFileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(newFileName);
            string newFileNameExtension = System.IO.Path.GetExtension(newFileName);
            string newFilePath = System.IO.Path.Combine(fileInfo.Directory.FullName, newFileName);

            if (System.IO.File.Exists(newFilePath))
            {
                switch (fileExistBehavior)
                {
                    case FileExistBehavior.None:
                        throw new System.IO.IOException("The destination file already exists.");
                    case FileExistBehavior.Replace:
                        System.IO.File.Delete(newFilePath);
                        break;
                    case FileExistBehavior.Rename:
                        int dupplicate_count = 0;
                        string newFileNameWithDupplicateIndex;
                        string newFilePathWithDupplicateIndex;
                        do
                        {
                            dupplicate_count++;
                            newFileNameWithDupplicateIndex = newFileNameWithoutExtension + " (" + dupplicate_count + ")" + newFileNameExtension;
                            newFilePathWithDupplicateIndex = System.IO.Path.Combine(fileInfo.Directory.FullName, newFileNameWithDupplicateIndex);
                        } while (System.IO.File.Exists(newFilePathWithDupplicateIndex));
                        newFilePath = newFilePathWithDupplicateIndex;
                        break;
                    case FileExistBehavior.Skip:
                        return;
                }
            }
            System.IO.File.Move(fileInfo.FullName, newFilePath);
        }
    }

このコードの使い方

class Program
    {
        static void Main(string[] args)
        {
            string targetFile = System.IO.Path.Combine(@"D://test", "New Text Document.txt");
            string newFileName = "Foo.txt";

            // full pattern
            System.IO.FileInfo fileInfo = new System.IO.FileInfo(targetFile);
            fileInfo.Rename(newFileName);

            // or short form
            new System.IO.FileInfo(targetFile).Rename(newFileName);
        }
    }
4
user5039044

Moveは同じことをしています=古いものをコピーして削除します。

File.Move(@"C:\ScanPDF\Test.pdf", @"C:\BackupPDF\" + string.Format("backup-{0:yyyy-MM-dd_HH:mm:ss}.pdf",DateTime.Now));
2

私の場合は、名前を変更したファイルの名前を一意にしたいので、その名前に日時スタンプを追加します。このように、「古い」ログのファイル名は常に一意です。

   if (File.Exists(clogfile))
            {
                Int64 fileSizeInBytes = new FileInfo(clogfile).Length;
                if (fileSizeInBytes > 5000000)
                {
                    string path = Path.GetFullPath(clogfile);
                    string filename = Path.GetFileNameWithoutExtension(clogfile);
                    System.IO.File.Move(clogfile, Path.Combine(path, string.Format("{0}{1}.log", filename, DateTime.Now.ToString("yyyyMMdd_HHmmss"))));
                }
            }
2
real_yggdrasil

自分に合ったアプローチが見つからなかったので、私のバージョンを提案します。もちろん入力、エラー処理が必要です。

public void Rename(string filePath, string newFileName)
{
    var newFilePath = Path.Combine(Path.GetDirectoryName(filePath), newFileName + Path.GetExtension(filePath));
    System.IO.File.Move(filePath, newFilePath);
}
1
valentasm
  public static class ImageRename
    {
        public static void ApplyChanges(string fileUrl,
                                        string temporaryImageName, 
                                        string permanentImageName)
        {               
                var currentFileName = Path.Combine(fileUrl, 
                                                   temporaryImageName);

                if (!File.Exists(currentFileName))
                    throw new FileNotFoundException();

                var extention = Path.GetExtension(temporaryImageName);
                var newFileName = Path.Combine(fileUrl, 
                                            $"{permanentImageName}
                                              {extention}");

                if (File.Exists(newFileName))
                    File.Delete(newFileName);

                File.Move(currentFileName, newFileName);               
        }
    }
1
AminGolmahalle