2009-06-14 3 views
2

У меня есть небольшая проблема с методом File.Copy в WPF, мой код очень прост, и я получаю исключение, когда я запускаю его,File.Copy и WPF

Could not find a part of the path 'Images\37c31987-52ee-4804-8601-a7b9b4d439fd.png'. 

где Images является относительным папку.

Вот мой код, как я сказал, простой и тот же код отлично работает в консольном приложении, без проблем.

string filenamae = System.IO.Path.Combine(images, Guid.NewGuid().ToString() + System.IO.Path.GetExtension(imageFile)); ; 
System.IO.File.Copy(imageFile, filenamae); 
this.ImageLocation = string.Empty; 

Так что если кто-нибудь может помочь, спасибо.

ответ

2

Имеется ли папка с изображениями? File.Copy не создает его автоматически.

Знаете ли вы, что ваш текущий каталог? Ярлыки открытия/сохранения файлов могут изменить это. Поэтому всегда безопаснее работать с абсолютными путями.

Делают

Path.GetFullPath(filename) 

и посмотреть, где что указывает. Правильно ли это место?

+0

папка существует. – abdelkarim

+0

и даже с вашим методом исключение все еще существует. – abdelkarim

2

Если вы используете абсолют вместо относительного пути, тогда он работает?

+0

папка находится в том же каталоге приложения, поэтому она должна быть абсолютной, и, кроме того, она отлично работает в консольном приложении. вот что остановило меня. Зачем? В чем разница между WPF-приложением и консольным приложением – abdelkarim

+0

«зачем нужно быть абсолютным» - потому что ваш текущий каталог не всегда будет таким же, как ваш EXE-каталог? Командная строка позволяет запускать EXE из каталога, отличного от текущего каталога. Ярлыки позволяют указать каталог запуска. В любом случае, действительно ли вы хотите, чтобы ваше приложение разбилось? Относительные пути - почти всегда плохая идея. –

+0

«зачем нужно быть абсолютным» - может быть, вам стоит попробовать и посмотреть, работает ли он, а затем беспокоиться о том, почему нужно быть абсолютным. – Josh

0

У вас есть отладчик? Почему бы не вставить точку останова и проверить значения, используемые на каждом шаге?

Если файловая система говорит «не может найти файл», я бы не стал спорить с ним ...

+0

оба значения верны. на самом деле, в консольном приложении он отлично работает. – abdelkarim

+0

Когда вы говорите консольное приложение, вы имеете в виду «не приложение winforms» или вы имеете в виду «в режиме отладки»? Что бы ни случилось, попробуйте записать значения в журнал событий в случае, когда ваш код НЕ работает ... – Benjol

1

Перед тем, как получить доступ к файлу, следует вызвать System.IO.File.Exists(). Из описания ошибки неясно, существует ли исходный файл или нет перед копией.

Если вы не указали абсолютный путь, ваш относительный путь часто разрешается из непредвиденных мест, обычно это текущий рабочий каталог процесса. Вызов этого метода может сказать, вы процесс в настоящее время работает:

System.IO.Directory.GetCurrentDirectory()

Вы никогда не должны делать предположение о текущем рабочем каталоге запущенного процесса, как пользователь может начать свой программы из любого места. Даже если вы считаете, что всегда контролируете текущий рабочий каталог, вы будете удивлены, как часто вы ошибаетесь.

+0

Добавление System.IO.File.Exists - лучший метод проверки файла перед его доступом. Это предотвращает исключения, которые потребляют время и ресурсы. –

0

использование \\ для каталога пути к файлу, если он в местном .. если файл существует в использовании сетевого пути \\\\ (atfirst) .. Так что искать сетевой диск ..

Благодаря

0

Необходимо встроить все внешние файлы в исполняемый файл и изменить свой код для работы с этими встроенными файлами, а не ожидать файлов на диске.

Для использования изображений или любых необходимых вам файлов («xml/txt/doc») необходимо установить действие сборки вашего файла в Embedded Resource и вызвать метод с полным именем файла, где имя собирается следующим образом:

[RootNameSpaceOfTheProject]. [NameOfFolderInTheProject].[FileNameWithExtension]

Пример:

enter image description here

Вызвать метод:

вар б = ResourceOperations.GetResourceAsByteArray ("Store.Resources.EmbeddedIcons.toolbox.png"); Теперь вы можете записать массив байтов во временный файл, например, и использовать его как источник изображения, или вы можете напрямую создать изображение из массива байтов. По крайней мере, у вас есть свои данные ...

и сохранить эти файлы на диск, мы должны написать код, @Jon Skeet:

public static void CopyStream(Stream input, Stream output) 
{ 
    // Insert null checking here for production 
    byte[] buffer = new byte[8192]; 

    int bytesRead; 
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, bytesRead); 
    } 
    } 

затем вызвать его:

using (Stream input = assembly.GetManifestResourceStream(resourceName)) 
    using (Stream output = File.Create(path)) 
    { 
     CopyStream(input, output); 
    } 
Смежные вопросы