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

  • Engadget

    Engadget

    18 EYLÜL 2006
  • Learn Math Tutorials

    Learn Math T

    20 Kasım 2011
  • talkandroid

    talkandroid

    27 Mayıs 2010