2

私がやりたいのは、特定のフォルダー内のすべてのファイルの名前を変更して、ファイル名に数字が含まれている場合にそのファイルが削除されるようにすることです。

たとえば、ファイル名が someFileName.someExtension同じである場合でも、ファイルがこのようなものである場合は、 03 - Rocketman Elton John名前をRocketman Elton John(削除する部分を実行しました-)に変更する必要があります。別の例では、ファイル名がである場合は、15-Trey Songz - Unfortunate (Prod. by Noah 40 Shebib)名前を変更する必要がありますTrey Songz Unfortunate (Prod. by Noah Shebib)(ここでも可能です)削除-)。ユーザーはこのようなフォルダを選択するように求められます

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 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 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;

しかし、私はそれが正しい方法だとは思いませんか?これを行うためのより良いオプションはありますか?または、これを行うのに最適な(そして唯一のオプション)ですか?また、INString.Replaceのようなものはありますか?SQLで言うとIN、selectコマンドで使用して、where条件の束を指定できますが、String.Replaceでこのようなものがあります。これにより、7行目から10行目まで実行したループを実行する必要がなくなります。他にもっと良いオプションはありますか?

ps:その正規表現について、私は数字の正規表現に関する質問を投稿しましたか?(どうやら私は十分に明確ではありませんでした)そしてそれから私は私の正規表現を手に入れました、あなたが他の正規表現がもっとうまくいくと思うなら私に教えてください、そしてあなたが他の情報を必要とするなら私に知らせてください...

4

5 に答える 5

1

単にファイルの名前を変更するだけで、独自のプログラムを作成するのが最善の方法であると考えている場合は、スタンドアロン ツールとしてPFrankをお勧めします (特に正規表現を既に理解している場合)。

これを希望し、私の提案を受け入れる場合 (そして、それは最も単純で明確なインターフェイスではないため)、(PFrank の最初の列にある) 一致式を使用\d+(\s?-)?します。これは、任意の桁数に一致する必要があります。ハイフンと、2 つの間の追加のオプションの空白文字によって。その場合、置換式はありません (長さゼロの文字列または PFrank の空の 2 番目の列)。最後に、名前を変更するファイルを含むフォルダーを選択し、scanボタンをクリックします。ポップアップするダイアログで結果を確認し、renameボタンをクリックします。誰かの時間を無駄にしてごめんなさい!

于 2012-04-12T14:27:05.597 に答える
1

Regex.Replace を試して数字を削除できます。つまり、次のようになります。

Regex.Replace(fileName, @"\d", "");
于 2012-04-12T04:21:42.993 に答える
0

ブラケットを使用して前後を選択し、$n メソッドを使用して文字列を希望どおりに再構築することをお勧めします。

"03 - Rocketman Elton John"  -Replace '^([^-]*) - ([^-]*)', '$1 $2'
于 2012-11-30T23:32:44.523 に答える
0

置き換えるには、一度にすべての出現を置き換えることができるRegex.Replaceを調べる必要があります。

それ以外の場合、コードは問題ないように見えます(fileName.Replace("match", "")定数文字列を使用する奇妙な例外を除いて...)

于 2012-04-12T04:21:28.077 に答える
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));
}

StartRenamingRegexメソッドは、一致に基づいて処理されるファイルの数を制限するようになりました。ファイルに数字が含まれていない場合は-処理され、プロセス全体が最適化されます。 文字列内のRenameFile数字とを置き換えて、-newFileName

ただし、その正確性についてはよくわかりませんが、問題はループFile.Move(file, Path.Combine(Path.GetDirectoryName(file), newFileName));を回避することだったと思います。適切な解決策を提供したと思います。foreach

これを完全にテストすることはできませんでした。うまくいくかどうかお知らせください。うまくいかない場合は、さらにサポートさせていただきます。

編集:file.Replace(@"(\d+)|(-+)", "")文字列だけでなく数字も削除することを忘れてい-ましたfile

編集:file.Replaceに修正Regex.Replace

于 2012-04-12T04:33:36.813 に答える