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();
}
}
}
}