public StreamItem GetStream(string strFilePath, FileMode mode, FileAccess access, bool bAddToCollection = true) { if (bAddToCollection == false) { StreamItem item = NewItem(strFilePath, mode, access, false); Debug.Assert(item.FileStream != null, ""); return(item); } { StreamItem item = this.FindItem(strFilePath, access); if (item != null) { item.Touch(); Debug.Assert(item.FileStream != null, ""); return(item); } item = NewItem(strFilePath, mode, access); Debug.Assert(item.FileStream != null, ""); return(item); } }
public StreamItem GetWriteStream(string strFilePath) { FileAccess access = FileAccess.Write; StreamItem item = this.FindItem(strFilePath, access); if (item != null) { item.Touch(); return(item); } return(NewItem(strFilePath, FileMode.OpenOrCreate, access)); }
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); }