2012-04-10 1 views
2

Это образец кода от Microsoft, с другой местоположение файла, который просто не будет работать:новой для C# - невозможно получить File.Copy работать

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 

Так это выглядит, как он удваивается обратный слэш, хотя дословная строка используется. (нет сомнений, что у меня есть файл test1.txt в C :) Любые идеи? Благодаря!

+3

Каково сообщение об ошибке и трассировке стека? – SLaks

+3

Удвоение обратных косых черт только для отображения. Какое сообщение об ошибке вы получаете. –

+0

Не могли бы вы разместить текст исключения? Двойная обратная косая черта прекрасна. – Matten

ответ

0

удвоения обратных косых черт является правильным, Я думаю, ваша проблема является именем файла. попытайтесь прочитать файл без этих операций, но прежде чем вы увидите, что вы «Скрываете выражения для известного типа», если вы это сделаете, то имя файла должно быть test1.txt.txt :)

+0

Спасибо, и спасибо вам больше, это была проблема !!! – MariusD

3

Двойная обратная косая черта - это нормальный способ представления обратного слэша в строке. Когда вы используете @, вы говорите, что не хотите интерпретировать какую-либо escape-последовательность (среди прочего, см. here для получения дополнительной информации в разделе «Литералы»)

Так что проблема в другом. Есть ли C: \ test1.txt и C: \ Test? У вас есть разрешение на запись в targetPath?

Попробуйте следующее (добавить обработку исключений и более проверки ошибок при необходимости)

if (!Directory.Exists(targetPath)) { 
    Directory.CreateDirectory(targetPath); 
} 
if (File.Exists(sourceFile)) { 
    File.Copy(sourceFile,destFile,true); 
} 
+1

Наверняка это комментарий, а не ответ !? – SkonJeet

+0

Он имеет те же предложения, что и верхний проголосовавший ответ ... и более подробно поясняет двойную обратную косую черту –

+0

. Дэвид Хеффернан рассмотрел все возможные причины проблемы - вы запрашиваете дополнительную информацию от OP для этого - и не упоминал о возможности того, что это может быть проблемой доступа. Все остальные в комментариях ОП охватывают все, что у вас есть в вашем «ответе», но не имеют шансов на получение репутации за то, что они отмечены как правильные. Не кажется справедливым. – SkonJeet

5

Есть 3 общих видов отказов:

  1. Исходный файл C:\test1.txt не существует.
  2. Файл назначения C:\Test\test1.txt существует, но доступен только для чтения.
  3. Целевой каталог C:\Test не существует.

Моя догадка заключается в том, что проблема 3 является проблемой, и если вам нужно убедиться, что каталог назначения существует до вызова File.Copy. Если это так, вы увидите DirectoryNotFoundException. Вы можете использовать Directory.CreateDirectory, чтобы убедиться, что каталог назначения существует.

+0

4. C: \ не существует/недоступен (очень маловероятно, что я знаю) – SkonJeet

+1

@SkonJeet Пункт 1 охватывает эту возможность. –

+0

True true, +1 .. – SkonJeet

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

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:\). Попытка написать файл или создать каталог в этом месте, вероятно, завершится неудачно, поэтому я предлагаю вам использовать другое место.