Dosya kilidi açılana kadar bekleyin .NET | Netgez.com
SORU
8 EYLÜL 2008, PAZARTESİ


Dosya kilidi açılana kadar bekleyin .NET

Bir dosya kilitli ve okumak için erişilebilir ve yeniden adlandırma kadar bir iş parçacığı engelleme en basit yolu nedir? Örneğin, orada bir WaitOnFile() yerde .NET Çerçeve?

Bir FileSystemWatcher FTP bir site, ama aktarılacak olan dosyaları aramak için kullandığı bir hizmeti vardosya oluşturulmuşdiğer işleminden önce olayı harekete dosya yazma işlemi bittikten.

İdeal çözüm iplik sonsuza kadar vazgeçmeden önce açılmıyor yani bir zaman aşımı süresi var.

Edit: bazı çözümler aşağıda denedikten Sonra o kadar değişen sona erdisistemtüm dosyalar için yazdı Path.GetTempFileName(), o zaman son konumuna File.Move() yapıldı. FileSystemWatcher olay kovduğunda, dosya zaten tamamlanmıştı.

CEVAP
8 EYLÜL 2008, PAZARTESİ


Bu related question verdiÄŸim cevap ÅŸuydu:

    /// <summary>
    /// Blocks until the file is not locked any more.
    /// </summary>
    /// <param name="fullPath"></param>
    bool WaitForFile(string fullPath)
    {
        int numTries = 0;
        while (true)
        {
              numTries;
            try
            {
                // Attempt to open the file exclusively.
                using (FileStream fs = new FileStream(fullPath,
                    FileMode.Open, FileAccess.ReadWrite, 
                    FileShare.None, 100))
                {
                    fs.ReadByte();

                    // If we got this far the file is ready
                    break;
                }
            }
            catch (Exception ex)
            {
                Log.LogWarning(
                   "WaitForFile {0} failed to get an exclusive lock: {1}", 
                    fullPath, ex.ToString());

                if (numTries > 10)
                {
                    Log.LogWarning(
                        "WaitForFile {0} giving up after 10 tries", 
                        fullPath);
                    return false;
                }

                // Wait for the lock to be released
                System.Threading.Thread.Sleep(500);
            }
        }

        Log.LogTrace("WaitForFile {0} returning true after {1} tries",
            fullPath, numTries);
        return true;
    }

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 24 Канал

    24 КанаÐ

    5 ÅžUBAT 2006
  • RaquelGamesBR

    RaquelGamesB

    20 HAZİRAN 2009
  • Top Gear

    Top Gear

    27 Mart 2006