5

ファイルのあるフォルダがあり.pdfます。ほとんどのファイルの名前で、特定の文字列を別の文字列に置き換えたいと思います。

これが私が書いたものです。

  private void btnGetFiles_Click(object sender, EventArgs e)
    {
        string dir = tbGetFIles.Text;
        List<string> FileNames = new List<string>();

        DirectoryInfo DirInfo = new DirectoryInfo(dir);

        foreach (FileInfo File in DirInfo.GetFiles())
        {
            FileNames.Add(File.Name);       
        }

        lbFileNames.DataSource = FileNames;
    }

ここでは、リストボックス内のすべてのファイル名を抽出します。

    private void btnReplace_Click(object sender, EventArgs e)
    {
        string strReplace = tbReplace.Text; // The existing string
        string strWith = tbWith.Text; // The new string

        string dir = tbGetFIles.Text;
        DirectoryInfo DirInfo = new DirectoryInfo(dir);
        FileInfo[] names = DirInfo.GetFiles();


        foreach (FileInfo f in names)
        {
            if(f.Name.Contains(strReplace))
            {
                f.Name.Replace(strReplace, strWith);
            }

        }

そして、ここで交換を行いたいのですが、問題が発生しています。何?

4

5 に答える 5

7

ディスク上のファイルの名前を変更したいようです。その場合は、File.MoveAPIを使用するか、ファイル名である実際の文字列を変更する必要があります。

あなたが犯しているもう一つの間違いは、Replace電話自体です。.NetのAstringは不変であるためReplace、新しいAPIを返すstringか、古いAPIを元の場所に変更するなどのすべての変更APIが返されます。変更を確認するには、新しい値を変数に割り当てる必要があります

string newName = f.Name.Replace(strReplace, strWith);
File.Move(f.Name, newName);
于 2012-05-07T19:18:14.510 に答える
2

f.Nameは読み取り専用のプロパティです。f.Name.Replace(..)は、必要なファイル名の新しい文字列を返すだけですが、実際にファイルを変更することはありません。
私はそれをテストしていませんが、私は以下に沿って何かを提案します:

File.Move(f.Name, f.Name.Replace(strReplace, strWith));
于 2012-05-07T19:18:55.357 に答える
1

別の文字列を返すように置き換えます。元の文字列は変更されません。
だからあなたは書く必要があります

string newName = f.Name.Replace(strReplace, strWith); 

もちろん、これによってディスク上のファイルの名前が変更されることはありません。
それがあなたの意図だったなら、あなたは見るべきです

File.Move(f.Name, newName);

また、宛先ファイルが存在する場合、File.Moveは例外で失敗することに注意してください。

例については、こちらをご覧ください

于 2012-05-07T19:18:07.463 に答える
0

一見すると、置き換えられた文字列をf.Name変数に再割り当てしていないように見えます。これを試して:

string NewFileName = f.Name.Replace(strReplace, strWith);
File.Copy(f.Name, NewFileName);
File.Delete(f.Name);
于 2012-05-07T19:17:42.270 に答える
0

これを呼び出しstring.Replaceても、既存の文字列は変更されません。代わりに、新しい文字列を返します。

コードを次のように変更する必要があります。

if(f.Name.Contains(strReplace)) 
{ 
    string newFileName = f.Name.Replace(strReplace, strWith); 
    //and work here with your new string
}
于 2012-05-07T19:22:25.637 に答える