Процесс не может получить доступ к файлу «XXX», поскольку он используется другим процессом, если я отправляю второй раз - PullRequest
1 голос
/ 29 октября 2019

У меня есть эта ошибка, когда я перезагружаю свою страницу в режиме разработки, чтобы создать второе письмо и отправить его с файлом, она попадает в первую переменную "emc", даже если это вторая переменная "eqc", которая является "true "и в prod все еще происходит эта ошибка, как будто файл все еще открыт, я не знаю, где, я знаю, что я должен закрыть" путь ", но вы можете сказать мне, где? Это мой код:

public ActionResult EditPersonalityTest([Bind(Include = "ID,EnglishProefficiencyBefore")] Recipient recipient, CohortSubscriptions cohortSubscriptions)
        {

            var property = db.CohortSubscriptions.Where(x => x.ID == cohortSubscriptions.ID).FirstOrDefault();

            property.EnglishProefficiencyBefore = cohortSubscriptions.EnglishProefficiencyBefore;


            db.Entry(property).State = EntityState.Modified;
            db.SaveChanges();

            Registrations registration = db.Registrations.Where(x => x.ID == property.RegistrationId).FirstOrDefault();
            bool isEnglish = IsEnglishLocale(registration);
            recipient.Name = registration.FirstName + " " + registration.LastName;
            recipient.Email = registration.Email;

            Recipient recipientModel = new Recipient();
            string directorypath = Server.MapPath("~/App_Data/" + "Files/");
            if (!Directory.Exists(directorypath))
            {
                Directory.CreateDirectory(directorypath);
            }
            byte[] data;

            bool englishMontreal = isEnglish  && registration.PreferredCampus == "Montreal";
            bool englishQuebec = isEnglish  && registration.PreferredCampus == "Québec";
            bool frenchMontreal = isEnglish == false && registration.PreferredCampus == "Montreal";
            bool frenchQuebec = isEnglish == false && registration.PreferredCampus == "Québec";

            //English Montreal First Contract
            var emc = new FileStream(Server.MapPath("~/Documents/Contrats Montreal English.pdf"), FileMode.Open);
            //English Quebec First Contract
            var eqc = new FileStream(Server.MapPath("~/Documents/Contrats Quebec English.pdf"), FileMode.Open);
            //English Secon Contract
            //var esc = new FileStream(Server.MapPath("~/Documents/CodeBoxx Technology Corporation English.pdf"), FileMode.Open);
            //French Montreal First Contract
            var fmc = new FileStream(Server.MapPath("~/Documents/Contrats Montreal French.pdf"), FileMode.Open);
            //French Quebec First Contract
            var fqc = new FileStream(Server.MapPath("~/Documents/Contrats Quebec French.pdf"), FileMode.Open);
            //French Second Contract
            //var fsc = new FileStream(Server.MapPath("~/Documents/CodeBoxx Technology Corporation Contrat.pdf"), FileMode.Open);


            if (englishMontreal == true)
            {


                //First contract
                using (Stream inputStream = emc)
                {
                    MemoryStream memoryStream = inputStream as MemoryStream;
                    if (memoryStream == null)
                    {
                        memoryStream = new MemoryStream();
                        inputStream.CopyTo(memoryStream);
                    }
                    data = memoryStream.ToArray();
                }
                serverpath = directorypath + recipient.Name.Trim() + ".pdf";
                System.IO.File.WriteAllBytes(serverpath, data);
                docusignContract(serverpath, recipient.Name, recipient.Email);
            }

            if (englishQuebec == true)
            {


                using (Stream inputStream = eqc)
                {
                    MemoryStream memoryStream = inputStream as MemoryStream;
                    if (memoryStream == null)
                    {
                        memoryStream = new MemoryStream();
                        inputStream.CopyTo(memoryStream);
                    }
                    data = memoryStream.ToArray();
                }
                serverpath = directorypath + recipient.Name.Trim() + ".pdf";
                System.IO.File.WriteAllBytes(serverpath, data);
                docusignContract(serverpath, recipient.Name, recipient.Email);


            }

            if (frenchMontreal == true)
            {
                using (Stream inputStream = fmc)
                {
                    MemoryStream memoryStream = inputStream as MemoryStream;
                    if (memoryStream == null)
                    {
                        memoryStream = new MemoryStream();
                        inputStream.CopyTo(memoryStream);
                    }
                    data = memoryStream.ToArray();
                }
                serverpath = directorypath + recipient.Name.Trim() + ".pdf";
                System.IO.File.WriteAllBytes(serverpath, data);
                docusignContract(serverpath, recipient.Name, recipient.Email);


            }

            if (frenchQuebec == true)
            {
                using (Stream inputStream = fqc)
                {
                    MemoryStream memoryStream = inputStream as MemoryStream;
                    if (memoryStream == null)
                    {
                        memoryStream = new MemoryStream();
                        inputStream.CopyTo(memoryStream);
                    }
                    data = memoryStream.ToArray();
                }
                serverpath = directorypath + recipient.Name.Trim() + ".pdf";
                System.IO.File.WriteAllBytes(serverpath, data);
                docusignContract(serverpath, recipient.Name, recipient.Email);

            }
            System.IO.File.Delete(serverpath);  //my supposition
            return View("ConfirmEditSubscriptions");

        }

1 Ответ

0 голосов
/ 31 октября 2019

Возможно, вы уже нашли проблему, но вот что я нашел.

Есть несколько FileStream open , которые никогда не использовались . Потоки emc, eqc, fmc, fqc открываются при каждом вызове функции, только 1 Утилизируется , поэтому при втором вызовенекоторые файлы по-прежнему being used by another process

Чтобы упростить отладку, я всегда начинаю удалять дублирование кода , в основном ваша функция имеет в 4 раза больше того же блока кода идентичен на 99% кроме источника inputStream.

Из вашего кода я также заметил, что этот блок кода всегда будет возвращать null inputStream

...
using (Stream inputStream = eqc) {
MemoryStream memoryStream = inputStream as MemoryStream; //eqc is a FileStream, it is not castable as MemoryStream, This is always null
...

Решение

Вот небольшой рефактор вашей функции. Я удалил unused variables и приблизил определение переменной к использованию. Вы также заметите, что не осталось ни одного оператора if () (Directory.CreateDirectory() не сгенерирует исключение, если каталог уже существует).
Мое правило для лучшего кода : Удалите как можно больше [если], это уменьшит пути к коду и вероятность ошибок.

public ActionResult EditPersonalityTest([Bind(Include = "ID,EnglishProefficiencyBefore")] Recipient recipient, CohortSubscriptions cohortSubscriptions)
{
    var property = db.CohortSubscriptions.Where(x => x.ID == cohortSubscriptions.ID).FirstOrDefault();

    property.EnglishProefficiencyBefore = cohortSubscriptions.EnglishProefficiencyBefore;

    db.Entry(property).State = EntityState.Modified;
    db.SaveChanges();

    Registrations registration = db.Registrations.Where(x => x.ID == property.RegistrationId).FirstOrDefault();
    recipient.Name = registration.FirstName + " " + registration.LastName;
    recipient.Email = registration.Email;

    //Array to map campus name to FileNamePart
    var campusNameMap = new[] {
        new { PreferredCampus = "Montreal", FileNamePart = "Montreal" },
        new { PreferredCampus = "Québec", FileNamePart = "Quebec" },
    };

    //Generate pdfDocumentPath based on isEnglish and registration.PreferredCampus
    string campusFileNamePart = campusNameMap.Single(campus => campus.PreferredCampus == registration.PreferredCampus).FileNamePart;
    string languageFileNamePart = IsEnglishLocale(registration) ? "English" : "French";

    //Use only 1 inputStream
    using (FileStream inputStream = new FileStream(Server.MapPath($"~/Documents/Contrats {campusFileNamePart} {languageFileNamePart}.pdf"), FileMode.Open))
    {
        MemoryStream memoryStream = new MemoryStream();
        inputStream.CopyTo(memoryStream);

        string directorypath = Server.MapPath("~/App_Data/Files/");
        Directory.CreateDirectory(directorypath);

        string serverpath = $"{directorypath}{recipient.Name.Trim()}.pdf";
        System.IO.File.WriteAllBytes(serverpath, memoryStream.ToArray());

        docusignContract(serverpath, recipient.Name, recipient.Email);

        System.IO.File.Delete(serverpath);
    }

    return View("ConfirmEditSubscriptions");
}

Надеюсь, это сработает для вас.

...