abc_1、abc_2 ... abc_n のような名前のフォルダーに 1000 以上のファイルがあります。
この接頭辞「abc_」をすべてのファイルから削除したいと考えています。1000 以上あるため、これを手動で行わない可能性があり、それは面倒です。
c# でこれを行うにはどうすればよいですか?
このコードで試すことができます
DirectoryInfo d = new DirectoryInfo(@"C:\DirectoryToAccess");
FileInfo[] infos = d.GetFiles();
foreach(FileInfo f in infos)
{
File.Move(f.FullName, f.FullName.Replace("abc_",""));
}
あなたは使用することができ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
。
次のコードは機能しますが、テストされていませんが、
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");
DirectoryInfoクラスと GetFiles() メソッドを確認する必要があります。そして、Move() メソッドを提供するFileクラスを見てください。
File.Move(oldFileName, newFileName);
ファイルを列挙できます。
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);
延長は覚悟してください。
string path = @"C:\NewFolder\";
string[] filesInDirectpry = Directory.GetFiles(path, "abc*");
forearch(string file in filesInDirectory)
{
FileInfo fileInfo = new FileInfo(file);
fileInfo.MoveTo(path + "NewUniqueFileNamHere");
}
Total Commanderには、複数のファイルの名前を変更する機能があります(小さなタスクごとに自分でツールをプログラムする必要はありません)。
このコードにより、ユーザーはファイル名の一部を置き換えることができます。同じ部分を持つディレクトリに多くのファイルがある場合に便利です。
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);
}
renamerを使用して、このコマンドはトリックを実行します。
$ renamer --find "abc_" *