📄 fileutilityservice.cs
字号:
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <version value="$version"/>
// </file>
using Microsoft.Win32;
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
using System.Collections.Specialized;
using System.Drawing;
using System.Reflection;
using System.Resources;
using System.Diagnostics;
using System.Windows.Forms;
using System.Xml;
using ICSharpCode.Core.Services;
using ICSharpCode.Core.AddIns;
using ICSharpCode.Core.AddIns.Codons;
namespace ICSharpCode.Core.Services
{
public enum FileErrorPolicy {
Inform,
ProvideAlternative
}
public enum FileOperationResult {
OK,
Failed,
SavedAlternatively
}
public delegate void FileOperationDelegate();
public delegate void NamedFileOperationDelegate(string fileName);
/// <summary>
/// A utility class related to file utilities.
/// </summary>
public class FileUtilityService : AbstractService
{
readonly static char[] separators = { Path.DirectorySeparatorChar, Path.VolumeSeparatorChar };
string sharpDevelopRootPath;
public string SharpDevelopRootPath {
get {
return sharpDevelopRootPath;
}
}
public FileUtilityService()
{
sharpDevelopRootPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + Path.DirectorySeparatorChar + "..";
}
public string NETFrameworkInstallRoot {
get {
RegistryKey installRootKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\.NETFramework");
object o = installRootKey.GetValue("InstallRoot");
return o == null ? String.Empty : o.ToString();
}
}
public string[] GetAvaiableRuntimeVersions()
{
string installRoot = NETFrameworkInstallRoot;
string[] files = Directory.GetDirectories(installRoot);
ArrayList runtimes = new ArrayList();
foreach (string file in files) {
string runtime = Path.GetFileName(file);
if (runtime.StartsWith("v")) {
runtimes.Add(runtime);
}
}
return (string[])runtimes.ToArray(typeof(string));
}
public override void InitializeService()
{
base.InitializeService();
}
public override void UnloadService()
{
base.UnloadService();
}
public StringCollection SearchDirectory(string directory, string filemask, bool searchSubdirectories)
{
StringCollection collection = new StringCollection();
SearchDirectory(directory, filemask, collection, searchSubdirectories);
return collection;
}
public StringCollection SearchDirectory(string directory, string filemask)
{
return SearchDirectory(directory, filemask, true);
}
/// <summary>
/// Finds all files which are valid to the mask <code>filemask</code> in the path
/// <code>directory</code> and all subdirectories (if searchSubdirectories
/// is true. The found files are added to the StringCollection
/// <code>collection</code>.
/// </summary>
void SearchDirectory(string directory, string filemask, StringCollection collection, bool searchSubdirectories)
{
try {
string[] file = Directory.GetFiles(directory, filemask);
foreach (string f in file) {
collection.Add(f);
}
if (searchSubdirectories) {
string[] dir = Directory.GetDirectories(directory);
foreach (string d in dir) {
SearchDirectory(d, filemask, collection, searchSubdirectories);
}
}
} catch (Exception e) {
IMessageService messageService =(IMessageService)ServiceManager.Services.GetService(typeof(IMessageService));
// don't translate this error (core messages generally can't be translated.)
messageService.ShowError(e, "Can't access directory " + directory);
}
}
/// <summary>
/// Converts a given absolute path and a given base path to a path that leads
/// from the base path to the absoulte path. (as a relative path)
/// </summary>
public string AbsoluteToRelativePath(string baseDirectoryPath, string absPath)
{
string[] bPath = baseDirectoryPath.Split(separators);
string[] aPath = absPath.Split(separators);
int indx = 0;
for(; indx < Math.Min(bPath.Length, aPath.Length); ++indx){
if(!bPath[indx].Equals(aPath[indx]))
break;
}
if (indx == 0) {
return absPath;
}
string erg = "";
if(indx == bPath.Length) {
erg += "." + Path.DirectorySeparatorChar;
} else {
for (int i = indx; i < bPath.Length; ++i) {
erg += ".." + Path.DirectorySeparatorChar;
}
}
erg += String.Join(Path.DirectorySeparatorChar.ToString(), aPath, indx, aPath.Length-indx);
return erg;
}
/// <summary>
/// Converts a given relative path and a given base path to a path that leads
/// to the relative path absoulte.
/// </summary>
public string RelativeToAbsolutePath(string baseDirectoryPath, string relPath)
{
if (separators[0] != separators[1] && relPath.IndexOf(separators[1]) != -1) {
return relPath;
}
string[] bPath = baseDirectoryPath.Split(separators[0]);
string[] rPath = relPath.Split(separators[0]);
int indx = 0;
for (; indx < rPath.Length; ++indx) {
if (!rPath[indx].Equals("..")) {
break;
}
}
if (indx == 0) {
return baseDirectoryPath + separators[0] + String.Join(Path.DirectorySeparatorChar.ToString(), rPath, 1, rPath.Length-1);
}
string erg = String.Join(Path.DirectorySeparatorChar.ToString(), bPath, 0, Math.Max(0, bPath.Length - indx));
erg += separators[0] + String.Join(Path.DirectorySeparatorChar.ToString(), rPath, indx, rPath.Length-indx);
return erg;
}
const string fileNameRegEx = @"^(([a-zA-Z]:)|.)[^:]*$";
/// <summary>
/// This method checks the file fileName if it is valid.
/// </summary>
public bool IsValidFileName(string fileName)
{
// Fixme: 260 is the hardcoded maximal length for a path on my Windows XP system
// I can't find a .NET property or method for determining this variable.
if (fileName == null || fileName.Length == 0 || fileName.Length >= 260) {
return false;
}
// platform independend : check for invalid path chars
foreach (char invalidChar in Path.InvalidPathChars) {
if (fileName.IndexOf(invalidChar) >= 0) {
return false;
}
}
if (fileName.IndexOf('?') >= 0 || fileName.IndexOf('*') >= 0) {
return false;
}
if (!Regex.IsMatch(fileName, fileNameRegEx)) {
return false;
}
// platform dependend : Check for invalid file names (DOS)
// this routine checks for follwing bad file names :
// CON, PRN, AUX, NUL, COM1-9 and LPT1-9
string nameWithoutExtension = Path.GetFileNameWithoutExtension(fileName);
if (nameWithoutExtension != null) {
nameWithoutExtension = nameWithoutExtension.ToUpper();
}
if (nameWithoutExtension == "CON" ||
nameWithoutExtension == "PRN" ||
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -