38

abc_1、abc_2 ... abc_n のような名前のフォルダーに 1000 以上のファイルがあります。

この接頭辞「abc_」をすべてのファイルから削除したいと考えています。1000 以上あるため、これを手動で行わない可能性があり、それは面倒です。

c# でこれを行うにはどうすればよいですか?

4

12 に答える 12

100

このコードで試すことができます

DirectoryInfo d = new DirectoryInfo(@"C:\DirectoryToAccess");
FileInfo[] infos = d.GetFiles();
foreach(FileInfo f in infos)
{
    File.Move(f.FullName, f.FullName.Replace("abc_",""));
}
于 2012-09-10T08:37:01.483 に答える
10

あなたは使用することができFile.MoveますString.Substring(index)

var prefix = "abc_";
var rootDir = @"C:\Temp";
var fileNames = Directory.EnumerateFiles(rootDir, prefix + "*", SearchOption.AllDirectories);
foreach(String path in fileNames)
{
    var dir = Path.GetDirectoryName(path);
    var fileName = Path.GetFileName(path);
    var newPath = Path.Combine(dir, fileName.Substring(prefix.Length));
    File.Move(path, newPath);
}

注:Directory.EnumerateFiles(rootDir, prefix + "*", SearchOption.AllDirectories);は、ルート ディレクトリからサブフォルダーも検索します。これが意図された使用でない場合SearchOption.TopDirectoryOnly

于 2012-09-10T08:37:39.250 に答える
3

次のコードは機能しますが、テストされていませんが、

 public class FileNameFixer
    {
        public FileNameFixer()
        {
            StringToRemove = "_";
            StringReplacement = "";


        }
        public void FixAll(string directory)
        {
            IEnumerable<string> files = Directory.EnumerateFiles(directory);
            foreach (string file in files)
            {
                try
                {
                    FileInfo info = new FileInfo(file);
                    if (!info.IsReadOnly && !info.Attributes.HasFlag(FileAttributes.System))
                    {
                        string destFileName = GetNewFile(file);
                        info.MoveTo(destFileName);
                    }
                }
                catch (Exception ex)
                {
                    Debug.Write(ex.Message);
                }
            }
        }

        private string GetNewFile(string file)
        {
            string nameWithoutExtension = Path.GetFileNameWithoutExtension(file);
            if (nameWithoutExtension != null && nameWithoutExtension.Length > 1)
            {
                return Path.Combine(Path.GetDirectoryName(file),
                    file.Replace(StringToRemove, StringReplacement) + Path.GetExtension(file));
            }
            return file;
        }

        public string StringToRemove { get; set; }

        public string StringReplacement { get; set; }
    }

このクラスは、次のように使用できます。

  FileNameFixer fixer=new FileNameFixer();
        fixer.StringReplacement = String.Empty;
        fixer.StringToRemove = "@@";
        fixer.FixAll("C:\\temp");
于 2012-09-10T08:46:20.383 に答える
3

DirectoryInfoクラスと GetFiles() メソッドを確認する必要があります。そして、Move() メソッドを提供するFileクラスを見てください。

File.Move(oldFileName, newFileName);
于 2012-09-10T08:38:56.517 に答える
3

ファイルを列挙できます。

using System.IO;

string[] filePaths = Directory.GetFiles(@"c:\MyDir\");

次に、文字列 [] を ForEach し、オブジェクトの新しいインスタンスを作成しIO.Fileます。

ファイルのハンドルを取得したら、Move メソッドを呼び出して、String.Replace("abc_", String.Empty) を渡します。

IO.File には直接の Rename メソッドがないため、Move と言いました。

File.Move(oldFileName, newFileName);

延長は覚悟してください。

于 2012-09-10T08:37:11.293 に答える
1
string path = @"C:\NewFolder\";    
string[] filesInDirectpry = Directory.GetFiles(path, "abc*");
forearch(string file in filesInDirectory)
{
    FileInfo fileInfo = new FileInfo(file);
    fileInfo.MoveTo(path + "NewUniqueFileNamHere");
}
于 2012-09-10T08:39:29.607 に答える
1

Total Commanderには、複数のファイルの名前を変更する機能があります(小さなタスクごとに自分でツールをプログラムする必要はありません)。

于 2012-09-10T08:37:12.310 に答える
1

このコードにより、ユーザーはファイル名の一部を置き換えることができます。同じ部分を持つディレクトリに多くのファイルがある場合に便利です。

using System;
using System.IO;

// ...
    static void Main(string[] args)
    {
        FileRenamer(@"D:\C++ Beginner's Guide", "Module", "PDF");

        Console.Write("Press any key to quit . . . ");
        Console.ReadKey(true);
    }

    static void FileRenamer(string source, string search, string replace)
    {
        string[] files = Directory.GetFiles(source);

        foreach (string filepath in files)
        {
            int fileindex = filepath.LastIndexOf('\\');
            string filename = filepath.Substring(fileindex);

            int startIndex = filename.IndexOf(search);
            if (startIndex == -1)
                continue;
            int endIndex = startIndex + search.Length;

            string newName = filename.Substring(0, startIndex);
            newName += replace;
            newName += filename.Substring(endIndex);

            string fileAddress = filepath.Substring(0, fileindex);
            fileAddress += newName;

            File.Move(filepath, fileAddress);
        }

        string[] subdirectories = Directory.GetDirectories(source);
        foreach (string subdirectory in subdirectories)
            FileRenamer(subdirectory, search, replace);
    }
于 2016-07-02T19:44:54.110 に答える
-3

renamerを使用して、このコマンドはトリックを実行します。

$ renamer --find "abc_" *
于 2013-09-23T17:02:32.003 に答える