4

これは Microsoft のコード サンプルで、ファイルの場所が異なりますが、動作しません。

 string fileName = "test1.txt";
 string sourcePath = @"C:\";
 string targetPath = @"C:\Test\";

 // Use Path class to manipulate file and directory paths.
 string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
 string destFile = System.IO.Path.Combine(targetPath, fileName);

 System.IO.File.Copy(sourceFile, destFile, true);

ソースファイルが見つかりません。ブレークポイントを設定すると、次のようになります。

    args    {string[0]} string[]
    fileName    "test1.txt" string
    sourcePath  "C:\\"  string
    targetPath  "C:\\Test\\"    string
    sourceFile  "C:\\test1.txt" string
    destFile    "C:\\Test\\test1.txt"   string

そのため、逐語的な文字列が使用されているにもかかわらず、バックスラッシュが 2 倍になっているように見えます。(C に test1.txt ファイルがあることは間違いありません:) 何かアイデアはありますか? ありがとう!

4

5 に答える 5

7

3 つの一般的な障害モードがあります。

  1. ソースファイルC:\test1.txtが存在しません。
  2. 宛先ファイルC:\Test\test1.txtは存在しますが、読み取り専用です。
  3. 宛先ディレクトリC:\Testが存在しません。

私の推測では、項目 3 が問題であり、その場合は、呼び出す前に宛先ディレクトリが存在することを確認する必要がありますFile.Copy。この場合、 が表示されますDirectoryNotFoundException。を使用Directory.CreateDirectoryして、宛先ディレクトリが存在することを確認できます。

于 2012-04-10T14:15:09.767 に答える
4

2 つのバックスラッシュは、文字列内のバックスラッシュを表す通常の方法です。@ を使用すると、エスケープ シーケンスを解釈したくないということになります (特に、詳細については、「リテラル」の下のこちらを参照してください)。

したがって、問題は異なります。C:\test1.txt と C:\Test は存在​​しますか? targetPath への書き込み権限はありますか?

以下を試してください(必要に応じて例外処理とエラーチェックを追加してください)

if (!Directory.Exists(targetPath)) {
    Directory.CreateDirectory(targetPath);
}
if (File.Exists(sourceFile)) {
    File.Copy(sourceFile,destFile,true);
}
于 2012-04-10T14:14:43.197 に答える
0

何が問題なのかを正確に確認するには、コードをtry-catchブロックでラップします。

try { // Code that can throw an exception }
catch (Exception ex)
{
    // Show what went wrong
    // Use Console.Write() if you are using a console
    MessageBox.Show(ex.Message, "Error!");
}

最も可能性の高い問題は、ソース ファイルが見つからない、宛先フォルダーが存在しない、またはその場所にアクセスする権限がないことです。

Windows 7 では、オペレーティング システムがインストールされているドライブ (通常はc:\) のルートに直接書き込むには、管理者権限が必要であることに気付きました。その場所にファイルを書き込もうとしたり、ディレクトリを作成しようとすると、おそらく失敗するので、別の場所を使用することをお勧めします。

于 2012-04-10T15:11:27.867 に答える
0

問題がある場合は、次の例を試してみてください。

using System;
using System.IO;
class Test 
{
    public static void Main() 
    {
        string path = @"c:\temp\MyTest.txt";
        string path2 = path + "temp";

        try 
        {
            // Create the file and clean up handles.
            using (FileStream fs = File.Create(path)) {}

            // Ensure that the target does not exist.
            File.Delete(path2);

            // Copy the file.
            File.Copy(path, path2);
            Console.WriteLine("{0} copied to {1}", path, path2);

            // Try to copy the same file again, which should succeed.
            File.Copy(path, path2, true);
            Console.WriteLine("The second Copy operation succeeded, which was expected.");
        } 

        catch 
        {
            Console.WriteLine("Double copy is not allowed, which was not expected.");
        }
    }
}

から取得: http://msdn.microsoft.com/en-us/library/system.io.file.copy(v=vs.71).aspx

于 2012-04-10T14:17:15.807 に答える
0

バックスラッシュの二重化は正しいです。問題はファイル名だと思います。その操作なしでファイルを読み取ろうとしますが、ファイル名が test1.txt.txt である必要がある場合は、「既知のタイプの拡張機能を非表示にする」かどうかを確認する前に:)

于 2012-04-10T14:17:17.320 に答える