2012-08-01 7 views
6

ben (muhtemelen bilginin benim eksikliği) garip bir sorun ile şaşırıp kapalı olduğunda bile siler. Eğer bu kodu f ile çalıştırırsam, f bir mediaplayerda oynayan bir video dosyasıdır, istisna atar. Bu iyi çalışıyor ve beklendiği gibi. Şimdi mediaplayer'ı kapattığımda dosyayı siler !? Uygulamam uzun süre kapalı olsa bile. Visual Studio'yu kapattığımda bile, mediaplayer'ı kapattığımda dosyayı siler. Dosyanın bir noktada silindiğinden emin olmak için bir yere kurulum yapılır. Bu durum istenmeyen davranışlarda. Ben hala Sil ve MoveTo arasında daha iyi yapabileceğini biliyorumSil fonksiyonları çağıran uygulaması Ben söz konusu kodu sunmak,

if (!IsFileLocked(f)) 
{ 
    try 
    { 
     f.Delete(); 
     fTemp.MoveTo(f.FullName); 
     Console.WriteLine("INFO: Old file deleted new file moved in > {0}", f.FullName); 
    } 
    catch (IOException ex) 
    { 
     Console.WriteLine("ERROR: Output file has IO exception > {0}", f.FullName); 
     Environment.ExitCode = 1; 

    } 

    catch (UnauthorizedAccessException ex) 
    { 
     Environment.ExitCode = 2; 
     Console.WriteLine("ERROR: Output file is locked > {0}", f.FullName); 

    } 
} 
else 
{ 
    Environment.ExitCode = 3; 
    Console.WriteLine("ERROR: Couldn't delete file was locked"); 

} 

ama şimdi benim değişiklikleri alacağım: Ama

Sonucu şimdilik ... tam ters giderse ne olduğunu anlamaya olamaz , av tüfeği kodlama .....

+5

Ortam yürütücüsü büyük olasılıkla dosyayı "FILE_SHARE_DELETE" ile açmıştır; Dosya silinmek üzere işaretlenir ve medya yürütücü dosyayı kapattığında silme işlemi tamamlanır. –

+2

IOException ile verilen mesaj nedir? –

+0

Fakat sonra istisnanın yükseltilemeyeceğini umuyorum. Ayrıca, kitabımdaki dosyaların kilitli bir şekilde kilitlendiği Windows Media Player ile açtım ... ya da demek istediğin bayrakla aynı değil. – JHN

cevap

3

dosya hemen silinir veya yazılı olamaz çünkü IOException alıyorsanız. Ancak, Delete()'u aradığınızda, dosyanın silinmeye çağrıldığı anlaşılıyor. o açıkken medya oynatıcı olsa

ne olursa olsun program çalışırken olsun, kapattığında dosya hala silinmek üzere işaretlenir, dosyayı silinmeye durur. Böylece medya oynatıcı kapanırsa dosya silinir. Dosya here alınan aşağıdaki kodu ile kullanımda olup olmadığını

kontrol edebilirsiniz. Kilitlenmemesi için Delete ve Copy koşullu hale getirin ve iyi olmalısınız. Windows SDK itibaren

try 
{ 
    if(!IsFileLocked(f)) 
    { 
     f.Delete(); 
     fTemp.MoveTo(f.FullName); 
     Console.WriteLine("INFO: Old file deleted new file moved in > {0}", f.FullName); 
    } 
} 

protected virtual bool IsFileLocked(FileInfo file) 
{ 
    FileStream stream = null; 

    try 
    { 
    stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
    } 
    catch (IOException) 
    { 
    //the file is unavailable because it is: 
    //still being written to 
    //or being processed by another thread 
    //or does not exist (has already been processed) 
    return true; 
    } 
    finally 
    { 
    if (stream != null) 
     stream.Close(); 
    } 

    //file is not locked 
    return false; 
} 
+0

"Bayrağı temizleyemem" veya "machanisme" yerine yerleştirilmiş olabilir. Ya da daha iyisi, dosya ilk etapta silinebiliyorsa yapılabilecek bir kontrol var mı, bu davranış benim için şimdi tahmin edilemez. – JHN

+0

Yukarıdaki düzenlemeye bakın. –

+0

Anlıyorum, cevabımı yazmam çok uzun sürdü ... :) – Hinek

1

:

DeleteFile fonksiyonu yakın üzerinde silinmek üzere bir dosya işaretler. Bu nedenle, dosyanın son tanıtıcısı kapanana kadar dosya silme işlemi gerçekleşmez. Daha sonra dosya açmak için CreateFile çağrıları ERROR_ACCESS_DENIED ile başarısız olur.

0

Bildiğim kadarıyla anladığım kadarıyla, kendi program dosyası silinebilir kadar bekleyin ve ardından silin ve diğer dosya taşımak istiyorum. dosya üzerinde bir tanıtıcı açık olup olmadığını

Bunu yapmak için, sen kontrol edebilir, ancak bu yönetilmeyen kodu gerekiyor. Eğer

A) döngü dosyası

while(IsFileLocked(f)) { Thread.Sleep(100); } 

silinebilir verebilecek kadar dosyayı silmek başlamadan önce Is there a way to check if a file is in use?

protected virtual bool IsFileLocked(FileInfo file) 
{ 
    FileStream stream = null; 

    try 
    { 
     stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
    } 
    catch (IOException) 
    { 
     //the file is unavailable because it is: 
     //still being written to 
     //or being processed by another thread 
     //or does not exist (has already been processed) 
     return true; 
    } 
    finally 
    { 
     if (stream != null) 
      stream.Close(); 
    } 

    //file is not locked 
    return false; 
} 

: Bir başka yöntem Bu sorunun cevabını Methode kullanmak olacaktır

veya A seçmek veya B bağlıdır Eğer B)

if (IsFileLocked(f)) { return; } 

iptal Gereksinimlerinize göre.

+0

İki kelime: "Yarış Durumu" – asawyer