2012-04-12 10 views
2

ファイル名に数字が含まれている場合は削除されるように、特定のフォルダ内のすべてのファイルの名前を変更します。正規表現を使用してファイルの名前を変更する

は、ファイル名ならば、別の例を(私は-を削除する部分をやった)ファイル名は someFileName.someExtensionであれば、それはRocketman Elton Johnに名前を変更する必要があり、それは同じままですが、ファイルはこのようであれば、 03 - Rocketman Elton John、言います15-Trey Songz - Unfortunate (Prod. by Noah 40 Shebib)の名前をTrey Songz Unfortunate (Prod. by Noah Shebib)に変更する必要があります(やはり-を削除できます)。ユーザーは、それがリネームファイルに今、この

private void btnGo_Click(object sender, EventArgs e) 
{ 
    StartRenaming(txtFolder.Text); 
} 

private void StartRenaming(string FolderName) 
{ 
    string[] files = Directory.GetFiles(FolderName); 
    foreach (string file in files) 
     RenameFile(file); 
} 

のように始まるの名前を変更し、また、この

private void txtFolder_MouseDown(object sender, MouseEventArgs e) 
     { 
      FolderBrowserDialog fd = new FolderBrowserDialog(); 
      fd.RootFolder = Environment.SpecialFolder.Desktop; 
      fd.ShowNewFolderButton = true; 
      if (fd.ShowDialog() == DialogResult.OK) 
      { 
       txtFolder.Text = fd.SelectedPath; 
      } 
     } 

のようなフォルダを選択するように要求されて、私は、機能を必要としますファイル内の任意の数を削除する正規表現。 そのは私が何ができるかである

private void RenameFile(string FileName) 
{ 
    string fileName = Path.GetFileNameWithoutExtension(FileName); 
    /* here the function goes that will find numbers in filename using regular experssion and replace them */ 
} 

として実装されて、私は

1 var matches = Regex.Matches(fileName, @"\d+"); 
2 
3 if (matches.Count == 0) 
4 return null; 
5 
6 // start the loop 
7 foreach(var match in matches) 
8 { 
9  fileName = fileName.Replace(match, ""); /* or fileName.Replace(match.ToString(), ""), whatever be the case */  
10 } 
11 File.Move(FileName, Path.Combine(Path.GetDirectoryName(FileName), fileName)); 
12 return; 

のようなものを使用することができますしかし、私はそれはそれを行うための正しい方法だと思いませんか?これを行うためのより良い選択肢はありますか?これを行うにはこれが最善の方法ですか?また、String.ReplaceにINのようなものがありますか? sqlで私は選択コマンドでINを使用することができます条件の束を指定しますが、String.Replaceでこのようなものがありますので、ループを実行する必要はありません私は行7から10まで走った?他にも良い選択肢がありますか?

ps:私は質問を投稿しましたRegular Expression for numbers?(明らかに私は十分ではありませんでした)、それから私は正規表現を得ました。もしあなたが他の正規表現がもっと良くなると思うなら、情報は私に教えてください...

答えて

0

Regex.Replaceを交換すると、すべての発生を一度に置き換えることができます。

そうでないコードは(...定数文字列を使用して奇妙なfileName.Replace("match", "")を除いて)、[OK]を見て

+0

Thankx!それはタイプミスでした。私は今それを修正しました! :D – Razort4x

1

あなたはすなわち、数字を削除するRegex.Replaceを試すことができます。これについて

Regex.Replace(fileName, @"\d", ""); 
+0

私は彼が 'foreach'取り除くだけでなく、名前の変更プロセスを最適化したいと思います。 – AYK

0

どのように?

private void StartRenaming(string FolderName) 
{ 
    string[] files = Directory.GetFiles(FolderName); 
    string[] applicableFiles = (from string s in files 
           where Regex.IsMatch(s, @"(\d+)|(-+)", RegexOptions.None) 
           select s).ToArray<string>(); 

    foreach (string file in applicableFiles) 
     RenameFile(file); 
} 

private void RenameFile(string file) 
{ 
    string newFileName = Regex.Replace(file, @"(\d+)|(-+)", ""); 
    File.Move(file, Path.Combine(Path.GetDirectoryName(file), newFileName)); 
} 

StartRenaming方法についてRegex一致に基づいて処理するファイルの数を制限します。ファイルに数字または-が含まれている場合は、そのファイルが処理され、完全なプロセスが最適化されます。 RenameFileは、文字列に数字と-を置き換え、私もFile.Move(file, Path.Combine(Path.GetDirectoryName(file), newFileName));の正確性についてはかなり分かりませんが、私はあなたの問題はforeachループを避けるためだったと思いますあなたnewFileName

を与える、と私は、適切なを提供してきたと思います溶液。

私は完全にこれをテストすることができなかったことに注意してください、そう私はそれがあなたのために働くとそうでない場合、私はさらにあなたを助けて幸せになるかどうか教えてください。

EDIT:file.Replace(@"(\d+)|(-+)", "")file文字列から数字だけでなく、-を削除することを言及するのを忘れました。

EDIT:修正しfile.ReplaceRegex.Replaceあなたは単に単にファイルの名前を変更に探しているオフのチャンスで

1

に、あなたはあなた自身のプログラムを作成することが最善の方法だと思った - 私はPFrankをお勧めしますスタンドアロンのツールとして(すでに正規表現を理解している場合は特に)

あなたはこれを望んで行うと、あなたは(それが最も簡単かつ明確なインターフェイスではありませんので、と)私の提案を取るならば、あなたはを使用している場合桁の任意の数と一致する必要があり(PFrankの最初の列で)一致発現用は、必要に応じてハイフンと両者の間の追加の任意の空白文字が続きます。その場合、置換式はありません(PFrankでは長さゼロの文字列または空の2番目の列)。最後に、名前を変更したいファイルが入っているフォルダを選択し、scanボタンをクリックします。ポップアップするダイアログで、あなたの結果を確認し、renameボタンをクリックしてください。私は誰の時間を無駄にして申し訳ありません!

0

私は前と後を選択し、あなたがそれを可能にする方法を文字列を再構築するために$ nのメソッドを使用するために括弧を使用することを好みます。

"03 - Rocketman Elton John" -Replace '^([^-]*) - ([^-]*)', '$1 $2' 
関連する問題