ASP.NET - использование System.IO.File.Delete () для удаления файла (ов) из каталога внутри wwwroot? - PullRequest
3 голосов
/ 05 марта 2010

У меня есть веб-служба ASP.NET SOAP, веб-метод которой создает файл PDF, записывает его в каталог «Download» приложения и возвращает URL-адрес пользователю. Код:

//Create the map images (MapPrinter) and insert them on the PDF (PagePrinter).
MemoryStream mstream = null;
FileStream fs = null;
try
{
    //Create the memorystream storing the pdf created.
    mstream = pgPrinter.GenerateMapImage();
    //Convert the memorystream to an array of bytes.
    byte[] byteArray = mstream.ToArray();
    //return byteArray;

    //Save PDF file to site's Download folder with a unique name.
    System.Text.StringBuilder sb = new System.Text.StringBuilder(Global.PhysicalDownloadPath);
    sb.Append("\\");
    string fileName = Guid.NewGuid().ToString() + ".pdf";
    sb.Append(fileName);
    string filePath = sb.ToString();
    fs = new FileStream(filePath, FileMode.CreateNew);
    fs.Write(byteArray, 0, byteArray.Length);
    string requestURI = this.Context.Request.Url.AbsoluteUri;
    string virtPath = requestURI.Remove(requestURI.IndexOf("Service.asmx")) + "Download/" + fileName;
    return virtPath;
}
catch (Exception ex)
{
    throw new Exception("An error has occurred creating the map pdf.", ex);
}
finally
{
    if (mstream != null) mstream.Close();
    if (fs != null) fs.Close();
    //Clean up resources
    if (pgPrinter != null) pgPrinter.Dispose();
}

Затем в файле Global.asax веб-службы я установил таймер в прослушивателе событий Application_Start. В прослушивателе Timela ElapsedEvent я ищу любые файлы в каталоге Download, которые старше интервала Timer (для тестирования = 1 мин., Для развертывания ~ 20 мин.) И удаляю их. Код:

//Interval to check for old files (milliseconds), also set to delete files older than now minus this interval.
private static double deleteTimeInterval;
private static System.Timers.Timer timer;
//Physical path to Download folder.  Everything in this folder will be checked for deletion.
public static string PhysicalDownloadPath;

void Application_Start(object sender, EventArgs e)
{
    // Code that runs on application startup
    deleteTimeInterval = Convert.ToDouble(System.Configuration.ConfigurationManager.AppSettings["FileDeleteInterval"]);
    //Create timer with interval (milliseconds) whose elapse event will trigger the delete of old files
    //in the Download directory.
    timer = new System.Timers.Timer(deleteTimeInterval);
    timer.Enabled = true;
    timer.AutoReset = true;
    timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);

    PhysicalDownloadPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "Download";
}

private static void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
{
    //Delete the files older than the time interval in the Download folder.
    var folder = new System.IO.DirectoryInfo(PhysicalDownloadPath);
    System.IO.FileInfo[] files = folder.GetFiles();
    foreach (var file in files)
    {
        if (file.CreationTime < DateTime.Now.AddMilliseconds(-deleteTimeInterval))
        {
            string path = PhysicalDownloadPath + "\\" + file.Name;
            System.IO.File.Delete(path);
        }
    }
}

Это работает отлично, за одним исключением. Когда я публикую приложение веб-службы в inetpub \ wwwroot (Windows 7, IIS7), оно не удаляет старые файлы в каталоге загрузки. Приложение прекрасно работает, когда я публикую в IIS из физического каталога, а не из wwwroot. Очевидно, что IIS устанавливает какую-то блокировку файлов в корне сети. Я проверил, выдавая себя за администратора, чтобы запустить приложение, и оно все еще не работает. Любые советы о том, как обойти блокировку программно, когда в wwwroot? Клиент, вероятно, захочет опубликовать приложение в корневом каталоге.

Ответы [ 3 ]

4 голосов
/ 05 марта 2010

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

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

1 голос
/ 05 марта 2010

Вместо записи непосредственно в файловую систему, почему бы не использовать изолированное хранилище?
http://msdn.microsoft.com/en-us/library/system.io.isolatedstorage.isolatedstorage.aspx

Это должно решить любые проблемы, связанные с местоположением или разрешением, которые у вас возникают

0 голосов
/ 21 мая 2010

Я забыл вернуться и ответить на мой вопрос.

Я должен был дать IIS_IUSRS группу Изменить разрешения для каталога, где я читал / писал файлы.

Спасибо всем, кто ответил.

...