A couple of the methods I have used most in the following code segment return a List object, or an ArrayList of text found inside a file to inspect.
Other methods that I've used a lot edit an existing file from a specific line number, or retrieve the full text from a specific file.
I've overloaded the AddToFile() method to allow varying ways to edit a file. Let me know if you extend this tool; I like collaboration.
-aendenne
/*
* Author: aendenne
* Email: AutomateAnything@yahoo.com
* Create Date: April 21, 2007
* Last Modified Date: September 25,
2007
* Version: 1.1
*/
using
System;
using
System.Collections;
using
System.Collections.Generic;
using System.IO;
namespace YourNamespace.Tools
{
/// <summary>
/// Class that stores static methods to create,
access,
/// (especially read from) and manipulate files
/// </summary>
/// <remarks>
/// does NOT include good error-handling. this is
not a
/// recommended practice, please extend the
try/catch
statements...
/// i will post a simple error tool soon.
/// </remarks>
public
class FileTool
{
/// <summary>
/// string
constant to store message to return
/// if file
exists, and user does NOT wish to override
/// </summary>
private
const string
m_FileExistsMessage =
"The
file already exists: ";
/// <summary>
/// Gets
string indicating the current directory
/// </summary>
/// <returns>string
value of the current directory</returns>
public static
string
GetCurrentDirectory()
{
try
{
return
Directory.GetCurrentDirectory().ToString();
}
catch
(Exception ex)
{
//ErrorTool.ProcessError(ex);
//return
null;
throw
(ex);
}
}
/// <summary>
/// Creates a
file in path suggested, and writes the
/// contents
to that file
/// </summary>
/// <param
name="path">
/// string
value indicating path (include file name)
/// to store
new file in
/// </param>
/// <param
name="contents">
/// string
value storing the contents to write
/// to the new
file
/// </param>
/// <param
name="overwrite">
/// bool value
indicating whether to replace file in path
/// if one
already exists at that location
/// </param>
public static
void
WriteNewFile(string path,
string
contents, bool overwrite)
{
try
{
CreateNewFile(path, overwrite);
AddToFile(path, contents, true);
}
catch (Exception ex)
{
//ErrorTool.ProcessError(ex);
//return;
throw
(ex);
}
}
/// <summary>
/// Creates a
file at the indicated path
/// </summary>
/// <param
name="path">
/// string
value indicating where to store
/// the new
file (include file name)
/// </param>
/// <param
name="overwrite">
/// bool value
indicating whether to replace file in path
/// if one
already exists at that location
/// </param>
/// <returns>
/// bool value
indicating whether file was created
/// </returns>
public static bool CreateNewFile(string path, bool overwrite)
{
try
{
if
(File.Exists(path)
&& !overwrite)
{
//Exception
ex = new Exception(m_FileExistsMessage);
//ErrorTool.ProcessError(ex);
return false;
}
FileStream
file = new FileStream(
path, FileMode.Create);
file.Close();
return true;
}
catch
(Exception ex)
{
//ErrorTool.ProcessError(ex);
//return false;
throw(ex);
}
}
/// <summary>
/// Deletes
the file indicated from the system
/// </summary>
/// <param
name="path">
/// string
value indicating full file path to delete
/// </param>
private
static void
m_DeleteFile(string path)
{
try
{
if
(!File.Exists(path))
return;
File.Delete(path);
}
catch
(Exception ex)
{
//ErrorTool.ProcessError(ex);
//return;
throw
(ex);
}
}
/// <summary>
/// Checks
path to be sure it's a file, and if so,
/// makes that
file writeable (may have been read-only...)
/// </summary>
/// <param
name="path">
/// string
path/filename to set as editable
/// </param>
private
static void
m_MakeEditable(string path)
{
try
{
if
(!File.Exists(path))
{
return;
//filepath doesn't exist
}
FileAttributes
attributes = File.GetAttributes(path);
if
((attributes & FileAttributes.Directory)
!= 0)
{
return;
//it's a directory/folder
}
attributes = FileAttributes.Normal;
File.SetAttributes(path,
attributes);
}
catch
(Exception ex)
{
//ErrorTool.ProcessError(ex);
//return;
throw
(ex);
}
}
/// <summary>
/// Opens and
existing file, and adds to its contents
/// </summary>
/// <param
name="path">
/// string
value: full path/filename to add to
/// </param>
/// <param
name="appendage">
/// string
value: stream of characters/words to add
/// </param>
/// <param
name="newLine">
/// bool value
indicating whether to start at a new line
/// </param>
public static
void
AddToFile(string path,
string
appendage, bool newLine)
{
try
{
StreamWriter
writer = File.AppendText(path);
if
(newLine)
{
writer.WriteLine();
}
writer.Write(appendage);
writer.Close();
}
catch
(Exception ex)
{
//ErrorTool.ProcessError(ex);
//return;
throw
(ex);
}
}
/// <summary>
/// Opens a
file and adds the supplied text
/// to that
file at the specified line number
/// </summary>
/// <param
name="path">
/// String
indicating the file path, including
/// the name
of the file
/// </param>
/// <param
name="textToInsert">
/// String to
insert/add to the file
/// </param>
/// <param
name="lineNumber">
/// Zero-based
line number----if the text should
/// be added
at line 10, then pass 9
/// </param>
public static
void
AddToFile(string path,
string
textToInsert, int lineNumber)
{
try
{
ArrayList
lines = GetLinesFromFile(path);
if
(lines.Count > lineNumber)
{
lines.Insert(lineNumber, textToInsert);
}
else
{
lines.Add(textToInsert);
}
StreamWriter
writer = new StreamWriter(path);
foreach
(string lineToWrite in
lines)
{
writer.WriteLine(lineToWrite);
}
writer.Close();
}
catch
(Exception ex)
{
//ErrorTool.ProcessError(ex);
//return;
throw
(ex);
}
}
/// <summary>
/// Opens a
file and adds the supplied text
/// to that
file after the first line found,
/// that
contains the textToInsertAfter string.
/// Will add
at 0 (first line), if not found at all.
/// </summary>
/// <param
name="path">
/// String
indicating the file path, including
/// the name
of the file
/// </param>
/// <param
name="textToInsert">
/// String to
insert/add to the file
/// </param>
/// <param
name="textToInsertAfter">
/// Text to
place the new string after, will be
/// inserted
on the next line
/// </param>
public static
void
AddToFile(string path,
string
textToInsert, string
textToInsertAfter)
{
try
{
ArrayList
lines = GetLinesFromFile(path);
int
location = 0;
int
currentLine = 0;
foreach
(string lineToRead in
lines)
{
if
(lineToRead.Contains(textToInsertAfter))
{
location = currentLine
+ 1;
}
currentLine += 1;
}
lines.Insert(location,
textToInsert);
StreamWriter
writer = new StreamWriter(path);
foreach
(string lineToWrite in
lines)
{
writer.WriteLine(lineToWrite);
}
writer.Close();
}
catch
(Exception ex)
{
//ErrorTool.ProcessError(ex);
//return;
throw
(ex);
}
}
/// <summary>
/// Opens and existing
file, and adds to its contents
/// (adds at
the end of prior contents)
/// </summary>
/// <param
name="path">
/// string
value: full path/filename to add to
/// </param>
/// <param name="appendage">
/// string
value: stream of characters/words to add
/// </param>
public static
void
AddToFile(string path, string
appendage)
{
try
{
if
(!File.Exists(path))
{
CreateNewFile(path, true);
}
AddToFile(path, appendage, true);
}
catch
(Exception ex)
{
//ErrorTool.ProcessError(ex);
//return;
throw
(ex);
}
}
/// <summary>
/// Closes an
open FileStream object
/// </summary>
/// <param
name="fileToClose">FileStream to
close</param>
public static
void
CloseFile(FileStream
fileToClose)
{
try
{
fileToClose.Close();
}
catch
(Exception ex)
{
//ErrorTool.ProcessError(ex);
//return;
throw
(ex);
}
}
/// <remarks>
/// USES A METHOD FROM StringTool.cs!
/// Will not compile/execute without that file,
/// so remove/comment this method if you don't have
it
/// </remarks>
/// <summary>
/// Checks for
existence of a path
/// </summary>
/// <param
name="directoryPath">
/// string
value of path to check for
/// </param>
/// <returns>
/// bool value
indicating whether the requested path exists
/// </returns>
public static
bool
CheckForDirectory(string
directoryPath)
{
try
{
string
path = StringTool.GetFolderPath(directoryPath);
if (!Directory.Exists(path))
{
return
false;
}
else
{
return
true;
}
}
catch
(Exception ex)
{
//ErrorTool.ProcessError(ex);
//return;
throw
(ex);
}
}
/// <remarks>
/// USES A METHOD FROM StringTool.cs!
/// Will not compile/execute without that file,
/// so remove/comment this method if you don't have
it
/// </remarks>
/// <summary>
/// Creates a
directory (folder)
/// </summary>
/// <param
name="directoryPath">
/// string
value of path to create
/// </param>
public static
void
CreateDirectory(string directoryPath)
{
try
{
string
path = StringTool.GetFolderPath(directoryPath);
if (Directory.Exists(directoryPath))
{
return;
}
Directory.CreateDirectory(path);
}
catch
(Exception ex)
{
//ErrorTool.ProcessError(ex);
//return;
throw
(ex);
}
}
/// <remarks>
/// USES A METHOD FROM StringTool.cs!
/// Will not compile/execute without that file,
/// so remove/comment this method if you don't have
it
/// </remarks>
/// <summary>
/// Creates a
directory (folder) inside the path indicated
/// </summary>
/// <param
name="directoryPath">
/// string
value of path to create
/// </param>
/// <param
name="folderName">
/// string
name of the folder to create
/// </param>
public static
void
CreateDirectory(string directoryPath,
string
folderName)
{
try
{
string
path = StringTool.GetFolderPath(directoryPath);
path = path + folderName;
if
(Directory.Exists(directoryPath))
{
return;
}
Directory.CreateDirectory(path);
}
catch
(Exception ex)
{
//ErrorTool.ProcessError(ex);
//return;
throw
(ex);
}
}
/// <summary>
/// Grabs an
ArrayList of lines from filepath indicated
/// </summary>
/// <param
name="path">
/// string
value of filepath to get lines from
/// </param>
/// <returns>
/// ArrayList
object containing each string line in the file
/// </returns>
public static
ArrayList
GetLinesFromFile(string path)
{
try
{
ArrayList
lines = new ArrayList();
StreamReader
reader = new StreamReader(path);
string
currentLine = string.Empty;
while
((currentLine = reader.ReadLine()) != null)
{
lines.Add(currentLine);
}
reader.Close();
return
lines;
}
catch
(Exception ex)
{
//ErrorTool.ProcessError(ex);
//return;
throw
(ex);
}
}
/// <summary>
/// Grabs a
List of string lines from filepath indicated
/// </summary>
/// <param
name="path">
/// string
value of filepath to get lines from
/// </param>
/// <returns>
/// List
object containing each string line in the file
/// </returns>
public static
List<string> GetListOfLinesFromFile(string path)
{
try
{
List<string> lines = new
List<string>();
StreamReader
reader = new StreamReader(path);
string currentLine = string.Empty;
while
((currentLine = reader.ReadLine()) != null)
{
lines.Add(currentLine);
}
reader.Close();
return
lines;
}
catch
(Exception ex)
{
//ErrorTool.ProcessError(ex);
//return;
throw
(ex);
}
}
/// <summary>
/// Grabs all
text from filepath indicated
/// </summary>
/// <param
name="path">
/// string
value of filepath to get text from
/// </param>
/// <returns>
/// string
(just one) of all text in file
/// </returns>
public static
string
GetFullFileText(string path)
{
try
{
StreamReader
reader = new StreamReader(path);
string
text = reader.ReadToEnd();
reader.Close();
return
text;
}
catch
(Exception ex)
{
//ErrorTool.ProcessError(ex);
//return;
throw
(ex);
}
}
}
}
Not much verbiage necessary
to introduce a code file I'll paste below. It's all about string manipulation. There are
useful string functions in VB, and I have mimicked/extended some of
these.
The file includes string conversion functions, some data type identification functions,
some string edit functions,
and some string locater functions.
All methods in the class are static (one can call them without object
instantiation).
My favorites:
GetEachFieldValue:
Easily
grabs a list by parsing with any characters the developer chooses
GetExactPartOfString:
Extricates
a portion of a full stream of characters, based on a left and right
bound character of the developer's choice
GetFileNameFromPath:
Returns
just the filename, from inside
a full path. Developer can choose whether to include the extension, or
not.
Clean:
Purges
a string of any characters the developer wishes to remove. There is an
exceptions argument that allows fine-tuning.
/*
* Author: aendenne
* Email: AutomateAnything@yahoo.com
* Create Date: April 21, 2007
* Last Modified Date: August 14,
2007
* Version: 2.1
*/
using
System;
using
System.Collections.Generic;
namespace
YourNamespace.Tools
{
/// <summary>
/// Static class that exposes many string methods,
/// useful for string evaluation and edits
/// </summary>
public
static class
StringTool
{
#region
StringConstantsToHelpWithComparisons
private
const string
m_Letters = "abcdefghijklmnopqrstuvwxyz";
private
const string
m_Digits = "0123456789";
private
const string
m_ForwardSlash = "/";
private
const string
m_BackSlash = "\\";
private
const string
m_Period = ".";
private
const string
m_DollarSign = "$";
private
const string
m_PercentSign = "%";
private
const string
m_Comma = ",";
private
const string
m_Yes = "yes";
private
const string
m_No = "no";
private
const string
m_True = "true";
private
const string
m_False = "false";
private
const string
m_1 = "1";
private
const string
m_0 = "0";
private
const string
m_y = "y";
private
const string
m_n = "n";
#endregion
#region
DataTypeStringConstants
public
const string
m_GUID = "guid";
public
const string
m_Boolean1 = "boolean";
public
const string
m_Boolean2 = "bool";
public
const string
m_Byte = "byte";
public
const string
m_Char = "char";
public
const string
m_DateTime = "datetime";
public
const string
m_DBNull = "dbnull";
public
const string
m_Decimal = "decimal";
public
const string
m_Double = "double";
public
const string
m_Empty = "empty";
public
const string
m_Int16_1 = "int16";
public
const string
m_Int16_2 = "short";
public
const string
m_Int32_1 = "int32";
public
const string
m_Int32_2 = "int";
public
const string
m_Int32_3 = "integer";
public
const string
m_Int64_1 = "int64";
public
const string
m_Int64_2 = "long";
public
const string
m_Object = "object";
public
const string
m_SByte = "sbyte";
public
const string
m_Single = "single";
public
const string
m_String = "string";
public
const string
m_UInt16 = "uint16";
public
const string
m_UInt32 = "uint32";
public
const string
m_UInt64 = "uint64";
#endregion
#region
MethodsThatCheckDataType
/// <summary>
/// Evaluates whether
passed-in string can be converted to a bool
/// </summary>
/// <param
name="stream">string to check</param>
/// <returns>
/// bool indicating whether
stream is a bool (0, 1, true/True,
/// false/False)
/// </returns>
public
static bool
IsStandardBool(string
stream)
{
try
{
if (stream == null
|| stream == string.Empty)
return false;
stream = stream.Trim().ToLower();
switch (stream)
{
case m_0:
return true;
case m_1:
return true;
case m_True:
return true;
case m_False:
return true;
default:
return false;
}
}
catch (Exception
ex)
{
//ErrorTool.ProcessError(ex);
return false;
}
}
/// <summary>
/// Evaluates whether
string can can be COERCED to a bool
/// </summary>
/// <param
name="stream">string to check</param>
/// <returns>
/// bool indicating whether
argument is a standard or custom bool
/// (0, 1, true/True,
false/False) OR (y/Y, yes/Yes, n/N, no/NO)
/// </returns>
public
static bool
IsFriendlyBool(string
stream)
{
try
{
if (stream == null
|| stream == string.Empty)
return false;
stream = stream.Trim().ToLower();
switch (stream)
{
case m_0:
return true;
case m_1:
return true;
case m_True:
return true;
case m_False:
return true;
case m_n:
return true;
case m_y:
return true;
case m_No:
return true;
case m_Yes:
return true;
default:
return false;
}
}