Удаление файла в C # - PullRequest
       20

Удаление файла в C #

4 голосов
/ 21 февраля 2009

Похоже, это должна быть очень простая тема, все примеры - всего лишь пара строк, но никаких достойных объяснений, и поэтому я продолжаю сталкиваться с одной и той же ошибкой без решения.

Короче говоря, эта часть приложения выглядит так

  1. Извлекает изображения из БД
  2. Создает фактические файлы изображений во временной папке
  3. создает PDF с изображениями внутри него
  4. теперь удаляйте созданные изображения.

Все работает до удаления. Я продолжаю получать сообщение об ошибке

InnerException:
System.ArgumentException: форматы URI не поддерживаются. at System.IO.Path.NormalizePathFast (строковый путь, логический полный контроль) ...

Я пробовал несколько разных способов для удаления последней версии:

foreach (string item in TempFilesList)
    {
        path = System.Web.HttpContext.Current.Application["baseWebDomainUrl"] + "/temp/" + item;
        fileDel = new FileInfo(path);
        fileDel.Delete();
    }

и попытка до этого была:

foreach (string item in TempFilesList)
    {
        File.Delete(System.Web.HttpContext.Current.Application["baseWebDomainUrl"] + "/temp/" + item);
    }

TempFilesList - список массивов, содержащий пути к удаляемым изображениям.

Ответы [ 7 ]

13 голосов
/ 21 февраля 2009

Вы должны попытаться вызвать Server.MapPath (путь), чтобы получить «реальный» путь к файлу. Передайте это в File.Delete, и оно должно работать (при условии, что права доступа к файлам и т. Д. Верны)

Так, например:

foreach (string item in TempFilesList)
{
    path = System.Web.HttpContext.Current.Application["baseWebDomainUrl"] + "/temp/" + item;
    path = Server.MapPath(path);
    fileDel = new FileInfo(path);
    fileDel.Delete();
}
7 голосов
/ 21 февраля 2009

Вам нужен фактический путь к файлу, который вы создали, а не URL пути, который вы создали. Ваш код создает путь, который выглядит примерно так: "http://www.mywebsite.com/location/temp/filename.jpg".

Вам нужно что-то похожее на "C: \ MyWorkingFolder \ filename.jpg".

Однако я бы не рекомендовал использовать Server.MapPath. Поскольку вы сами создаете файлы в своем собственном коде, вы контролируете место, где создается файл. Используйте это вместо этого. Сохраните его как ключ AppSettings в вашем файле web.config.

Например:

string basePath = ConfigurationManager.AppSettings["PdfGenerationWorkingFolder"];
foreach(string item in TempFilesList)
{
  File.Delete(basePath + item);
}
2 голосов
/ 21 февраля 2009

В системе Windows вы должны использовать \ вместо / для разделения папок в пути. Чтобы код работал на любой платформе, используйте метод Path.Combine, чтобы объединить путь:

path = Path.Combine(Path.Combine(System.Web.HttpContext.Current.Application["baseWebDomainUrl"], "temp"), item);
1 голос
/ 21 февраля 2009

Какой pdf-creater-tool вы используете? Вы проверили, поддерживает ли он поток в качестве входного параметра? тогда вам не нужно записывать временное изображение в виде файла ... и проблема с дырами исчезла ... - кстати, я голосовал за ответ Рандольфоса:

1 голос
/ 21 февраля 2009

Может быть, использование Server.MapPath(path) поможет?

foreach(string item in TempFilesList)
{
  string path = String.Format("{0}/temp/{1}", HttpContext.Current.Application["baseWebDomainUrl"], item);
  File.Delete(Server.MapPath(path));
}

И лучше использовать статический File.Delete() вместо создания нового FileInfo (путь) только для удаления

0 голосов
/ 21 февраля 2009

Я бы добавил это только на тот случай, если вы хотите, чтобы он попал в Корзину, а не взорвался:

FileSystem.DeleteFile(file.FullName, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin, Microsoft.VisualBasic.FileIO.UICancelOption.DoNothing);

Единственное, что отстой, это то, что в вашем C # вы должны ссылаться на пространство имен VisualBasic

using Microsoft.VisualBasic.FileIO;

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

0 голосов
/ 21 февраля 2009

Если вы сохранили изображения, вы должны использовать для этого путь к файлу. Вы не можете просто использовать тот же путь к файлу, чтобы удалить их? Это будет означать, что вы избежите двойного объединения путей к файлам. (что примечание: вы, вероятно, должны использовать Path.Combine для)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...