200 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| /*********************************************************************************************
 | |
|  * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
 | |
|  * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
 | |
|  * ------------------------------------------------------------------------------
 | |
|  * $Workfile: VETempFile.cs $     $Revision: 1 $
 | |
|  * $Author: Kathy $   $Date: 7/27/04 8:45a $
 | |
|  *
 | |
|  * $History: VETempFile.cs $
 | |
|  * 
 | |
|  * *****************  Version 1  *****************
 | |
|  * User: Kathy        Date: 7/27/04    Time: 8:45a
 | |
|  * Created in $/LibSource/VENetwork
 | |
|  *********************************************************************************************/
 | |
| 
 | |
| using System;
 | |
| using System.IO;
 | |
| using System.Windows.Forms;
 | |
| 
 | |
| 
 | |
| namespace VENetwork
 | |
| {
 | |
| 	// this class manages the temps directory for multi-user support in ve-proms.
 | |
| 	// The temps directory is used to handle a user's temporary files in support of 
 | |
| 	// printing, etc.
 | |
| 	public class VETempFile
 | |
| 	{
 | |
| 		public string TemporaryDirectoryName;
 | |
| 		private string TemporaryFileName;
 | |
| 		public string TempNum;
 | |
| 		FileStream tmpFs;
 | |
| 		private string CurrentDir;
 | |
| 
 | |
| 		public VETempFile(string cd)
 | |
| 		{
 | |
| 			CurrentDir = cd;
 | |
| 			tmpFs=null;
 | |
| 		}
 | |
| 	
 | |
| 		~ VETempFile()
 | |
| 		{
 | |
| 			CloseTempProc();
 | |
| 		}
 | |
| 		
 | |
| 		// Converts the userid, num & PorD (characters 'P' or 'D') into a file-
 | |
| 		// name to be used for temporary file support. This creates the file-
 | |
| 		// name. The userid is extended to 8 characters with '_'s.
 | |
| 		public string MakeTempName(string userid, string num, char PorD)
 | |
| 		{
 | |
| 			// first, make the temp directory, i.e. temps, if it doesn't
 | |
| 			// exist.
 | |
| 			DirectoryInfo di = new DirectoryInfo(CurrentDir + "temps");
 | |
| 			if (!di.Exists) di.Create();
 | |
| 			string tmpuid = userid.PadRight(8,'_');
 | |
| 			string tpath = "temps" + "\\" + tmpuid + "." + PorD.ToString() + num;
 | |
| 			return tpath;
 | |
| 		}
 | |
| 
 | |
| 		// This method truncates the temp file (user___.P##) and then closes it.
 | |
| 		public void CloseTempProc()
 | |
| 		{
 | |
| 			if(tmpFs!=null)
 | |
| 			{
 | |
| 				try
 | |
| 				{
 | |
| 					// if called from a destructor, the file may have been closed - reopen
 | |
| 					// it if we can't write
 | |
| 					if (tmpFs.CanWrite==false)
 | |
| 					{
 | |
| 						tmpFs=null;
 | |
| 						tmpFs = new FileStream(TemporaryFileName,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);
 | |
| 					}
 | |
| 					tmpFs.Seek(0L,SeekOrigin.Begin);
 | |
| 					tmpFs.SetLength(0L);   // truncate the file
 | |
| 					tmpFs.Close();
 | |
| 					tmpFs=null;
 | |
| 					TemporaryDirectoryName=null;
 | |
| 				}
 | |
| 				catch (Exception e)
 | |
| 				{
 | |
| 					MessageBox.Show(e.Message,this.TemporaryDirectoryName);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// make all subdirectories, if not exist
 | |
| 		private void MakeAllNecessaryDirectories(string path)
 | |
| 		{
 | |
| 			if (Directory.Exists(CurrentDir + path)) return;
 | |
| 
 | |
| 			// Create the directory, and any subdirectories
 | |
| 			DirectoryInfo di = Directory.CreateDirectory(CurrentDir + path);
 | |
| 		}
 | |
| 
 | |
| 		// sets class variables based on input.
 | |
| 		private void SetUpTempDir(string userid, string num)
 | |
| 		{
 | |
| 			string TempPath = MakeTempName(userid,num,'D'); 
 | |
| 			MakeAllNecessaryDirectories(TempPath);
 | |
| 			TemporaryDirectoryName = TempPath + "\\";
 | |
| 		}
 | |
| 
 | |
| 		// This method attempts to attach to the specified temp file.
 | |
| 		// Userid and num are combined to create a process name and
 | |
| 		// TempPathDirectory. If the file is successfully opened and
 | |
| 		// a connection is established, a byte count matching the process
 | |
| 		// number is written to the file and the file is held open. (This
 | |
| 		// byte count is actually written in the connection logic,
 | |
| 		// veconn.cs, after a connection is successfully made.)
 | |
| 		public bool AttachSpecificTemp(string userid, string num)
 | |
| 		{
 | |
| 			// if already open, close.
 | |
| 			CloseTempProc();
 | |
| 			string pname = CurrentDir + MakeTempName(userid,num,'P');
 | |
| 
 | |
| 			// check to see if this user can use the file, i.e. open
 | |
| 			// exclusively.
 | |
| 			try
 | |
| 			{
 | |
| 				tmpFs = new FileStream(pname,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);
 | |
| 			}
 | |
| 			catch
 | |
| 			{
 | |
| 				return false;
 | |
| 			}
 | |
| 			TemporaryFileName = pname;
 | |
| 			TempNum = num;
 | |
| 			SetUpTempDir(userid,num);
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		// if len is !0, try to delete files of the specified length.
 | |
| 		// zero length files are normally in transition and will be 
 | |
| 		// deleted by their owners.
 | |
| 		public void DeleteFiles(string tmp, int len)
 | |
| 		{	
 | |
| 			DirectoryInfo di = new DirectoryInfo(Directory.GetCurrentDirectory());
 | |
| 			FileInfo [] fis = di.GetFiles(tmp);
 | |
| 			foreach (FileInfo fi in fis)
 | |
| 			{
 | |
| 				if (len==0 || len==fi.Length) fi.Delete();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// find the next available temp directory for a given userid.
 | |
| 		public bool FindAvailableTempDir(string userid)
 | |
| 		{
 | |
| 			// first look for existing temp files for this user to see if any
 | |
| 			// can be used.
 | |
| 			int i;
 | |
| 			string ptmp = MakeTempName(userid,"*",'P'); // create a template
 | |
| 
 | |
| 			// check to see if any exist.
 | |
| 			DirectoryInfo di = new DirectoryInfo(CurrentDir);
 | |
| 			FileInfo [] fis = di.GetFiles(ptmp);
 | |
| 			for (i=0;i<fis.Length;i++)
 | |
| 			{
 | |
| 				FileInfo fi = fis[i];
 | |
| 				string ptr = fi.Name.Substring(fi.Name.IndexOf(".")+2);
 | |
| 				if (AttachSpecificTemp(userid,ptr))
 | |
| 				{
 | |
| 					if (fi.Length>0)
 | |
| 					{
 | |
| 						// this was left from a reboot or something.
 | |
| 						// delete ownership and wrq files of the
 | |
| 						// specified size. Check to see if it is
 | |
| 						// consistent with the process file first.
 | |
| 						DeleteFiles("*.own",(int)fi.Length);
 | |
| 						DeleteFiles("*.wrq",(int)fi.Length);
 | |
| 					}
 | |
| 					return true;
 | |
| 				}
 | |
| 			}
 | |
| 			fis = null;
 | |
| 
 | |
| 			// Couldn't use an existing one, find a new one.
 | |
| 			for (i=0;i<99;i++)
 | |
| 				if (AttachSpecificTemp(userid,i.ToString("d2"))) return true;
 | |
| 			
 | |
| 			// if the user got this far, something's wrong - report error & exit.
 | |
| 			MessageBox.Show("Too many temporary process files for user.","VE-PROMS error");
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		// this method writes out the requested number of bytes to the file.
 | |
| 		public void WriteBytes(int num)
 | |
| 		{
 | |
| 			if (tmpFs != null)
 | |
| 			{
 | |
| 				while (num>0)
 | |
| 				{	
 | |
| 					tmpFs.WriteByte((byte)'x');
 | |
| 					num--;
 | |
| 				}
 | |
| 				tmpFs.Flush();
 | |
| 
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |