public StreamItem NewItem(string strFilePath, FileMode mode, FileAccess access, bool bAddToCollection = true) { // 防备尺寸过大 if (bAddToCollection && _items.Count > MAX_ITEMS) { ClearAll(); } StreamItem item = new StreamItem { Fly = !bAddToCollection, FileAccess = access }; item.Touch(); item.FilePath = strFilePath; item.FileStream = File.Open( strFilePath, mode, // FileMode.OpenOrCreate, access, // FileAccess.Write, FileShare.ReadWrite); item.IncUse(); if (bAddToCollection) { m_lock.EnterWriteLock(); try { _items.Add(item); } finally { m_lock.ExitWriteLock(); } } Debug.Assert(item.FileStream != null, ""); return(item); }
public StreamItem NewItem(string strFilePath, FileMode mode, FileAccess access, bool bAddToCollection = true) { // 防备尺寸过大 if (bAddToCollection && _items.Count > MAX_ITEMS) { ClearAll(true); } StreamItem item = new StreamItem { Fly = !bAddToCollection, FileAccess = access }; item.Touch(); item.FilePath = strFilePath; int nRedoCount = 0; REDO: try { item.FileStream = File.Open( strFilePath, mode, // FileMode.OpenOrCreate, access, // FileAccess.Write, FileShare.ReadWrite); } catch (DirectoryNotFoundException ex) { if ((item.FileAccess & FileAccess.Write) != 0 && nRedoCount == 0) { // 创建中间子目录 PathUtil.TryCreateDir(PathUtil.PathPart(strFilePath)); nRedoCount++; goto REDO; } throw new Exception(ex.Message, ex); } item.IncUse(); if (bAddToCollection) { m_lock.EnterWriteLock(); try { _items.Add(item); } finally { m_lock.ExitWriteLock(); } } Debug.Assert(item.FileStream != null, ""); return(item); }