2

アプリで、既に存在するファイルのコピーを作成したい場合がありますが、ファイルが既に存在するかどうかをテストしたくありません。Windows 7 のように、そのファイルのコピーを作成することだけが必要です。 .

例: ファイルtips.txt。私のアプリがそれをコピーすると、tips - copy.txtという名前の別のファイルが作成されます。その後、必要に応じて、「コピーのコピー」のヒント - copy - copy.txt .

この状況で私にできることはありますか?

Obs: このアプリでは、.NET 3.5 と WPF を使用しています。

Obs2: この質問をしたのは、.NET に似たようなものが既に存在すると思ったからです。

4

9 に答える 9

7

ファイル名と拡張子を抽出してから、新しい形式の名前で単純な File.Copy を実行する必要があります

   string fileName = "tips.txt"; 
   string file = Path.GetFileNameWithoutExtension(fileName);
   string ext = Path.GetExtension(fileName);
   File.Copy(fileName, string.Format("{0} - Copy{1}", file, ext); 

コピー元のフルパスがある場合、事態はもう少し複雑になります

   string fileName = "C:\\test\\tips.txt"; 
   string path = Path.GetDirectoryName(fileName);
   string file = Path.GetFileNameWithoutExtension(fileName);
   string ext = Path.GetExtension(fileName);
   File.Copy(fileName, Path.Combine(path, string.Format("{0} - Copy{1}", file, ext)); 

しかし、本当に Windows エクスプローラーの動作を模倣したい場合は、次のようにする必要があります。

string fileName = "C:\\test\\tips.txt"; 
string path = Path.GetDirectoryName(fileName);
string file = Path.GetFileNameWithoutExtension(fileName);
string ext = Path.GetExtension(fileName);
if(file.EndsWith(" - Copy")) file = file.Remove(0, file.Length - 7);
string destFile = Path.Combine(path, string.Format("{0} - Copy{1}", file, ext)); 
int num = 2;
while(File.Exists(destFile))
{
    destFile = Path.Combine(path, string.Format("{0} - Copy ({1}){2}", file, num, ext)); 
    num++;
}
File.Copy(fileName, destFile); 

Windows エクスプローラーが " - Copy" で終わるファイルをコピーすると、別の " - Copy" ではなく、宛先ファイルに連続番号が追加されます。
文字列「Copy」はローカライズされているため、オペレーティング システムの英語以外のバージョンでは変更されることも考慮する必要があります。

于 2012-10-03T12:33:26.093 に答える
3

Windows コピー ダイアログとまったく同じセマンティクスを取得する場合は、名前空間でのクラスの使用を示唆する他の回答に加えて、 IFileOperation COM オブジェクトSystem.IOを使用できます。そして、これがマネージド ラッパーです。

于 2012-10-03T12:34:49.033 に答える
3

これがまさにあなたの言いたいことかどうかはわかりませんが、

string fileName = "tips.txt";
File.Copy(fileName, string.format("{0} - copy", fileName);

または:

File.Copy(fileName, string.format("{0} - copy{1}", 
    Path.GetFileNameWithoutExtension(fileName),
    Path.GetExtension(fileName));
于 2012-10-03T12:26:34.827 に答える
1

どうですか :

    public static void CopyFileLikeWin7(string pathIn,string fileName, string pathOut)
    {
        string potentialFileName = Path.Combine(pathOut,fileName);
        if(File.Exists(potentialFileName))
        {
            CopyFileLikeWin7(pathIn, Path.GetFileNameWithoutExtension(fileName) + "-copy" + Path.GetExtension(fileName), pathOut);
        }
        else
        {
            File.Copy(pathIn,potentialFileName);
        }
    }
于 2012-10-03T12:29:56.553 に答える
1

http://msdn.microsoft.com/en-us/library/9706cfs5.aspxを使用できますFile.Copy

于 2012-10-03T12:26:00.743 に答える
1

どうですか

string fileName = "tips.txt";
string filenamewithoutext = Path.GetFileNameWithoutExtension(fileName);
string ext = Path.GetExtension(fileName);
File.Copy(fileName, string.format("{0} - Copy{1}", filenamewithoutext, ext);
于 2012-10-03T12:31:24.673 に答える
0

このようなもの?これを行うには、もっと簡単な方法がたくさんあると思います。

string destination = "";
var fileInfo = new FileInfo(@"c:\temp\tips.txt");
var ext = fileInfo.Extension;
var filename = fileInfo.Name.Remove(fileInfo.Name.Length - 4);
File.Copy(fileInfo.FullName, destination + filename + " - Copy" + ext);
于 2012-10-03T12:29:23.823 に答える
0

OK、テストしないでください。ファイルをコピーするだけで例外を処理しない

try
{
File.Copy("",""); 
} 
finally 
{
}
于 2012-10-03T12:26:47.013 に答える