Установить разрешения для папки, используемой приложением winform - PullRequest
1 голос
/ 05 мая 2010

Мое приложение winform периодически извлекает флэш-файл из базы данных SQL, записывает его во временную папку, отображает его в элементе управления webbroswer, а затем удаляет его из временной папки. Мое приложение создает временную папку, если она не существует. Временная папка находится в «System.Environment.CurrentDirectory».

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

Как убедиться, что файл удален?

Я добавил код для удаления временной папки, а затем заново создавал ее при каждой записи в нее, но это не решило мою проблему.

Только мое приложение должно иметь доступ к этой папке, и папка содержит только эти флэш-образы.

Я думал об использовании общей папки 'temp', но где-то читал, что это может привести к проблемам.

Кроме того, у меня возникла та же проблема, когда я нашел временную папку в 'D: \'.

Я использую VS2008 на Windows XP. Приложение должно работать на XP, Vista и 7.

Вот код.

DataSet dsFlashQuizRandom = new DataSet();
dsFlashQuizRandom = objUserDAO.GetFlashQuizRandom(intAge);
if (dsFlashQuizRandom.Tables[0].Rows[0]["large_image_blob"] != null && dsFlashQuizRandom.Tables[0].Rows[0]["file_name"].ToString().Trim() != string.Empty)
{
     byte[] b = (byte[])dsFlashQuizRandom.Tables[0].Rows[0]["large_image_blob"];
     if (b != null)
     {
          string flashFileName = dsFlashQuizRandom.Tables[0].Rows[0]["file_name"].ToString().Trim();
          string targetPath = System.Environment.CurrentDirectory.ToString() + @"\images\";
          string strFileName = targetPath + flashFileName;

          //Delete the current version of the folder (if it exists); then create a new version of it.
          if (System.IO.Directory.Exists(targetPath))
              System.IO.Directory.Delete(targetPath, true);
          if (!System.IO.Directory.Exists(targetPath))
              System.IO.Directory.CreateDirectory(targetPath);

          //Write the file to a FileStream, assign that stream to the webbrowser control.
          FileStream fs = new FileStream(strFileName, FileMode.CreateNew, FileAccess.Write);
          fs.Write(b, 0, b.Length);
          fs.Close();
          webBrowserQuizFlash.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowserQuizFlash_DocumentCompleted);
          webBrowserQuizFlash.Url = new System.Uri(strFileName, System.UriKind.Absolute);
     }
}

//Delete the Flash Webbrowser file once it has completed loading.
private void webBrowserQuizFlash_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    FileInfo fi = new FileInfo(strFileName);
    try
    {
       fi.Delete();
    }
    catch (IOException ex)
    {
        MessageBox.Show("IOException = " + ex);  //test code
    }
}

Будем благодарны за любые предложения или указания в правильном направлении.

Ура, Фредерик

PS - при копировании моего кода в этот пост я вижу, что цвет текста после @ "\ images \" все красный; Есть ли проблема с этой частью моего кода, или это артефакт отображения? Должен ли я использовать это вместо: @ "\ images \\";

Ответы [ 2 ]

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

Я думаю, что проблема с доступом связана с другим приложением, которое блокирует файл. Одной из распространенных групп приложений, которая выполняет такие действия, будет сканер при доступе из вашей антивирусной программы.

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

Также вы можете внести небольшие изменения в ваш код:

//Write the file to a FileStream, assign that stream to the webbrowser control.
using(FileStream fs = new FileStream(strFileName, FileMode.CreateNew, FileAccess.Write))
{
    fs.Write(b, 0, b.Length);
}
0 голосов
/ 05 мая 2010

Вы можете использовать System.IO.Path.GetTempPath(), чтобы использовать временную папку.

Я предполагаю, что у вас проблемы с удалением из-за блокировки файла каким-либо процессом.Вы можете обойти это, используя функцию MoveFileEx, чтобы удалить ее при следующей перезагрузке.

...