0

C# の一括ファイル リネーマーを作成したいのですが、これが私の UI です ここに画像の説明を入力

tesフォルダーを作成しました。その中tesにはファイルがあります1.txt

ファイルにプレフィックスとサフィックスを追加するプログラムを作成したいので1.txtprefix1suffix

しかし、その後エラーが発生しました ここに画像の説明を入力

フォルダーにはfile already existファイルが1つしかないと言われていますが、これを機能させるにはどうすればよいですか? エラーはどこから来たのですか?tes1.txt

私は次のコードを試しました

private void Rename(string prefix, string filepath, string suffix)
    {            
        //i don't use prefix suffix yet to make sure if my function works
        DirectoryInfo d = new DirectoryInfo(filepath);
        FileInfo[] file = d.GetFiles();

        try
        {
            foreach (FileInfo f in file )
        {
            File.Move(f.FullName,"stackoverflow");
        }
        }
        catch (Exception e)
        {
            cmd.cetakGagal(e.ToString(), title);
        }
        cmd.cetakSukses("Rename Success", title);
    }

上の 2 番目の図と同じエラーが返されます。

次の画像はフォルダです。フォルダtesには何もありませんtes1.txt

ここに画像の説明を入力

4

4 に答える 4

3

File.Move()あなたのフルパスとあなたsourceFileNameの相対パスで呼び出していますdestFileName。相対ファイル パスは、ソース ファイル パスではなく、現在の作業ディレクトリに対して相対的です。stackoverflowおそらく、このコードを初めて実行したときに作成されたファイルが、現在の作業ディレクトリに存在するはずです。

于 2013-10-30T15:23:40.153 に答える
1

プレフィックスとサフィックスを使用せずFile.Moveに、それらすべてをStackOverflowに変更しています。ディレクトリにファイルが 1 つしかない場合は、問題になりません。ファイルは 1 つだけですか?

public static void Move(
    string sourceFileName,
    string destFileName
)

宛先ファイルの相対パスを指定しているため、この回答を見ることが手がかりになる可能性があります。現在の作業ディレクトリを取得するには、GetCurrentDirectoryを参照してください。

sourceFileName および destFileName 引数は、相対または絶対パス情報を指定できます。相対パス情報は、現在の作業ディレクトリを基準として解釈されます。

あなたは変わるべきです

File.Move(f.FullName,"stackoverflow");

string fileName = f.Name.Replace(f.Extenstion,string.Empty);
string newFileName = string.Format("{0}{1}{2}",prefix,fileName,suffix);
string newFileWithPath = Path.Combine(f.Directory,newFileName);
if (!File.Exists(newFileWithPath))
{
     File.Move(f.FullName,newFileWithPath);
}
于 2013-10-30T15:17:29.290 に答える
0

上記のコードでは、最初の実行後に「stackoverflow」がファイルとして存在するため、そのエラーが発生します。File.ExistsFile.Move を呼び出す前に、( を使用して) 移動先ファイルが存在するかどうかを確認してください。

于 2013-10-30T15:16:51.970 に答える
0

あなたの目標は名前を変更することなので、断片的なアプローチを使用するのではなく、ファイルで満たされたテスト フォルダーを使用することをお勧めします。このようなものが役立つかどうかを確認してください:

private void Rename(string prefix, string filepath, string suffix)
    {            
        //i don't use prefix suffix yet to make sure if my function works
        DirectoryInfo d = new DirectoryInfo(filepath);
        FileInfo[] file = d.GetFiles();

        try
        {
            foreach (FileInfo f in file )
        {
            f.MoveTo(@filepath + @"\" + prefix + f.Name.Insert(f.Name.LastIndexOf('.'),suffix));
        }
        }
        catch (Exception e)
        {
            cmd.cetakGagal(e.ToString(), title);
        }
        cmd.cetakSukses("Rename Success", title);
    }

余談ですが、リストビューを使用してファイル名とコミット前の変更を表示すると、不要な変更を防ぐのに役立ちます。

于 2013-10-30T17:45:11.257 に答える