internal static FileStream NewFileStream( string path, FileMode mode, FileAccess access, FileShare share ) { // TextWriter tw = new StreamWriter("filelog.txt",true); // tw.WriteLine("Open "+path); // tw.Close(); // return new FileStream2(path,mode,access,share); foreach(FileHandlingCacheEntry e in FileHandlingCache) { if(e.filename==path) { if((e.fm==mode)&&(e.fs.CanSeek)) { e.uses++; e.fs.Position=0; return e.fs; } else { CloseHandle(e); break; } } } if(FileHandlingCache.Count>Limit) { int trys = Limit-FileHandlingCache.Count; for(int t=0;t<trys;t++) { FileHandlingCacheEntry se = null; foreach(FileHandlingCacheEntry e in FileHandlingCache) { if(e.uses==0) { se=e; break; } } if(se!=null) CloseHandle(se); } } FileStream2 fs = new FileStream2(path,mode,FileAccess.ReadWrite,FileShare.None); FileHandlingCacheEntry en = new FileHandlingCacheEntry(path,fs,mode); fs.e=en; FileHandlingCache.Add( en ); return fs; }
internal FileHandlingCacheEntry(string filename, FileStream2 fs, FileMode fm) { this.fs=fs; this.fm=fm; this.filename=filename; uses=1; }