Laden...

Prozess kann auf eine Datei nicht zugreifen

Erstellt von hakbak vor 16 Jahren Letzter Beitrag vor 15 Jahren 1.049 Views
H
hakbak Themenstarter:in
108 Beiträge seit 2007
vor 16 Jahren
Prozess kann auf eine Datei nicht zugreifen

Hallo,
ich hab ein Problem.
Ich habe mir einen WebClient gebastelt. Über diesen wähle ich eine Datei aus und möchte diese herunterladen. Das ganze mache ich über einen Webservice. D.h. Dateiname wird dem Webservice geschickt dort wird die Datei zusammengebastelt in einen string konvertiert und wieder zurück geschickt. Im Client wird der String wieder zurück-konvertiert und zum DL angeboten.
Beim ersten Mal klappt das auch wunderbar und ich kann die Datei herunterladen, aber beim zweiten Mal wird gemeckert und zwar:

System.Web.Services.Protocols.SoapException: Die Anforderung konnte vom Server nicht verarbeitet werden. ---> System.IO.IOException: Der Prozess kann nicht auf die Datei C:\Inetpub\wwwroot\ws_test\Uploads\2456-5-600-00PR_01.02\ 2456-5-600-00PR_01.02.xml zugreifen, da sie von einem anderen Prozess verwendet wird.

Ich hab das Gefühl, dass hier irgendeine FileOperation oder sowas nicht geschlossen wird und deswegen muss ich erst auf irgendeinen Timeout warten, bis ich die Datei wieder runterladen kann, aber ich kann einfach nichts finden.
Hier mal der Code:

  1. Client Code

protected void Button1_Click(object sender, EventArgs e)
    {
        Button1.Text = "Download";
        string fileName = DropDownList1.SelectedItem.Text;
        //kService.createFile(DropDownList1.SelectedItem.Text);
        byte[] binaryData;
        string file = kService.createFile(DropDownList1.SelectedItem.Text);
        try
        {
            binaryData = Convert.FromBase64String(file);
            if (Directory.Exists((@"c:/Filesystem/ClientUploads/" + fileName)))
            {
                //do nothing
            }
            else
            {
                Directory.CreateDirectory(@"c:/Filesystem/ClientUploads/" + fileName);
            }



            string outputFileName = (@"c:/Filesystem/ClientUploads/" + fileName + "/" + fileName + ".XIP");
            FileStream outFile;
            outFile = new FileStream(outputFileName, FileMode.Create, FileAccess.Write);
            outFile.Write(binaryData, 0, binaryData.Length);
            outFile.Close();

            if (File.Exists(outputFileName))
            {
                FileInfo downloadFile = new FileInfo(outputFileName);
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", downloadFile.Name));
                HttpContext.Current.Response.AddHeader("Content-Length", downloadFile.Length.ToString());
                HttpContext.Current.Response.ContentType = "application/octet-stream";
                HttpContext.Current.Response.WriteFile(downloadFile.FullName);
                //Log Eintrag generieren
                HttpContext.Current.Response.End();
            }
        }
        catch (Exception ex)
        {
        }       
    }
  1. Der WebService Code

public string createFile(string fileName)
    {
        SWCollExport swCE = new SWCollExport();
        SqlConnection myConnection2 = new SqlConnection (System.Web.Configuration.WebConfigurationManager.ConnectionStrings ["Deploy_db_testConnectionString"].ConnectionString); ;
        string file = "";
        string path = Server.MapPath(@"~\Uploads\" + fileName);
        if (Directory.Exists(path.Replace(" ","_")))
        { }
        else
        {
            Directory.CreateDirectory(path.Replace(" ", "_"));
        }
        //string applPath = @"C:\";
        //swCE.RunPath = Path.GetDirectoryName(applPath);
        swCE.SWCollectionName = fileName;
        swCE.SQLConnectionToUse = myConnection2;
        swCE.XMLCreateEvent += new SWCollExport.SWCollSendMessageType(swCE_XMLCreateEvent);
        swCE.XIPCreateEvent += new SWCollExport.SWCollSendMessageType(swCE_XIPCreateEvent);
        swCE.ExportSwCollection(path.Replace(" ", "_") + "\\" + fileName + ".XIP", path.Replace(" ", "_"));
        file = createFileString(path.Replace(" ", "_") + "\\" + fileName.Replace(" ", "_") + ".XIP");
        return file;
    }

    void swCE_XIPCreateEvent(string Message)
    {
        ;// throw new Exception("The method or operation is not implemented.");
    }

    void swCE_XMLCreateEvent(string Message)
    {
        ;// throw new Exception("The method or operation is not implemented.");
    }

    private string createFileString(string fileName)
    {
        string fileString = "";
        //string filePath = Server.MapPath(@"~/Uploads/" + customer + "/" + fileName);
        FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read);
        byte[] binaryData = new Byte[file.Length];
        long bytesRead = file.Read(binaryData, 0,
                                    (int)file.Length);
        file.Close();
        fileString = Convert.ToBase64String(binaryData,
                                              0,
                                              binaryData.Length);
        return fileString;
    }

Also ich glaube, dass irgendwo eine file-operation nicht richtig beendet wird, ich kann aber auch falsch liegen, ich hoffe, ihr findet was. Danke!

S
709 Beiträge seit 2005
vor 15 Jahren

Hallo hakbak!

Ich habe den Code nicht genau durchgesehen oder getestet, aber beim File Handling empfehlt es sich, using {...} zu verwenden:


using (FileStream fs = new FileStream)
{
    // mit fs arbeiten
}

Bau das mal in deinen Code ein.

Viele Grüße,
Simon