📄 fileutility.cs
字号:
nameWithoutExtension == "NUL") {
return false;
}
char ch = nameWithoutExtension.Length == 4 ? nameWithoutExtension[3] : '\0';
return !((nameWithoutExtension.StartsWith("COM") ||
nameWithoutExtension.StartsWith("LPT")) &&
Char.IsDigit(ch));
}
/// <summary>
/// Checks that a single directory name (not the full path) is valid.
/// </summary>
public static bool IsValidDirectoryName(string name)
{
if (!IsValidFileName(name)) {
return false;
}
if (name.IndexOfAny(new char[]{Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar}) >= 0) {
return false;
}
if (name.Trim(' ').Length == 0) {
return false;
}
return true;
}
public static bool TestFileExists(string filename)
{
if (!File.Exists(filename)) {
MessageService.ShowWarning(StringParser.Parse("${res:Fileutility.CantFindFileError}", new string[,] { {"FILE", filename} }));
return false;
}
return true;
}
public static bool IsDirectory(string filename)
{
if (!Directory.Exists(filename)) {
return false;
}
FileAttributes attr = File.GetAttributes(filename);
return (attr & FileAttributes.Directory) != 0;
}
//TODO This code is Windows specific
static bool MatchN (string src, int srcidx, string pattern, int patidx)
{
int patlen = pattern.Length;
int srclen = src.Length;
char next_char;
for (;;) {
if (patidx == patlen)
return (srcidx == srclen);
next_char = pattern[patidx++];
if (next_char == '?') {
if (srcidx == src.Length)
return false;
srcidx++;
}
else if (next_char != '*') {
if ((srcidx == src.Length) || (src[srcidx] != next_char))
return false;
srcidx++;
}
else {
if (patidx == pattern.Length)
return true;
while (srcidx < srclen) {
if (MatchN(src, srcidx, pattern, patidx))
return true;
srcidx++;
}
return false;
}
}
}
static bool Match(string src, string pattern)
{
if (pattern[0] == '*') {
// common case optimization
int i = pattern.Length;
int j = src.Length;
while (--i > 0) {
if (pattern[i] == '*')
return MatchN(src, 0, pattern, 0);
if (j-- == 0)
return false;
if ((pattern[i] != src[j]) && (pattern[i] != '?'))
return false;
}
return true;
}
return MatchN(src, 0, pattern, 0);
}
public static bool MatchesPattern(string filename, string pattern)
{
filename = filename.ToUpper();
pattern = pattern.ToUpper();
string[] patterns = pattern.Split(';');
foreach (string p in patterns) {
if (Match(filename, p)) {
return true;
}
}
return false;
}
// Observe SAVE functions
public static FileOperationResult ObservedSave(FileOperationDelegate saveFile, string fileName, string message, FileErrorPolicy policy)
{
System.Diagnostics.Debug.Assert(IsValidFileName(fileName));
try {
saveFile();
OnFileSaved(new FileNameEventArgs(fileName));
return FileOperationResult.OK;
} catch (Exception e) {
switch (policy) {
case FileErrorPolicy.Inform:
using (SaveErrorInformDialog informDialog = new SaveErrorInformDialog(fileName, message, "${res:FileUtilityService.ErrorWhileSaving}", e)) {
informDialog.ShowDialog();
}
break;
case FileErrorPolicy.ProvideAlternative:
using (SaveErrorChooseDialog chooseDialog = new SaveErrorChooseDialog(fileName, message, "${res:FileUtilityService.ErrorWhileSaving}", e, false)) {
switch (chooseDialog.ShowDialog()) {
case DialogResult.OK: // choose location (never happens here)
break;
case DialogResult.Retry:
return ObservedSave(saveFile, fileName, message, policy);
case DialogResult.Ignore:
return FileOperationResult.Failed;
}
}
break;
}
}
return FileOperationResult.Failed;
}
public static FileOperationResult ObservedSave(FileOperationDelegate saveFile, string fileName, FileErrorPolicy policy)
{
return ObservedSave(saveFile,
fileName,
ResourceService.GetString("ICSharpCode.Services.FileUtilityService.CantSaveFileStandardText"),
policy);
}
public static FileOperationResult ObservedSave(FileOperationDelegate saveFile, string fileName)
{
return ObservedSave(saveFile, fileName, FileErrorPolicy.Inform);
}
public static FileOperationResult ObservedSave(NamedFileOperationDelegate saveFileAs, string fileName, string message, FileErrorPolicy policy)
{
System.Diagnostics.Debug.Assert(IsValidFileName(fileName));
try {
string directory = Path.GetDirectoryName(fileName);
if (!Directory.Exists(directory)) {
Directory.CreateDirectory(directory);
}
saveFileAs(fileName);
OnFileSaved(new FileNameEventArgs(fileName));
return FileOperationResult.OK;
} catch (Exception e) {
switch (policy) {
case FileErrorPolicy.Inform:
using (SaveErrorInformDialog informDialog = new SaveErrorInformDialog(fileName, message, "${res:FileUtilityService.ErrorWhileSaving}", e)) {
informDialog.ShowDialog();
}
break;
case FileErrorPolicy.ProvideAlternative:
restartlabel:
using (SaveErrorChooseDialog chooseDialog = new SaveErrorChooseDialog(fileName, message, "${res:FileUtilityService.ErrorWhileSaving}", e, true)) {
switch (chooseDialog.ShowDialog()) {
case DialogResult.OK:
using (SaveFileDialog fdiag = new SaveFileDialog()) {
fdiag.OverwritePrompt = true;
fdiag.AddExtension = true;
fdiag.CheckFileExists = false;
fdiag.CheckPathExists = true;
fdiag.Title = "Choose alternate file name";
fdiag.FileName = fileName;
if (fdiag.ShowDialog() == DialogResult.OK) {
return ObservedSave(saveFileAs, fdiag.FileName, message, policy);
} else {
goto restartlabel;
}
}
case DialogResult.Retry:
return ObservedSave(saveFileAs, fileName, message, policy);
case DialogResult.Ignore:
return FileOperationResult.Failed;
}
}
break;
}
}
return FileOperationResult.Failed;
}
public static FileOperationResult ObservedSave(NamedFileOperationDelegate saveFileAs, string fileName, FileErrorPolicy policy)
{
return ObservedSave(saveFileAs,
fileName,
ResourceService.GetString("ICSharpCode.Services.FileUtilityService.CantSaveFileStandardText"),
policy);
}
public static FileOperationResult ObservedSave(NamedFileOperationDelegate saveFileAs, string fileName)
{
return ObservedSave(saveFileAs, fileName, FileErrorPolicy.Inform);
}
// Observe LOAD functions
public static FileOperationResult ObservedLoad(FileOperationDelegate loadFile, string fileName, string message, FileErrorPolicy policy)
{
try {
loadFile();
OnFileLoaded(new FileNameEventArgs(fileName));
return FileOperationResult.OK;
} catch (Exception e) {
switch (policy) {
case FileErrorPolicy.Inform:
using (SaveErrorInformDialog informDialog = new SaveErrorInformDialog(fileName, message, "${res:FileUtilityService.ErrorWhileLoading}", e)) {
informDialog.ShowDialog();
}
break;
case FileErrorPolicy.ProvideAlternative:
using (SaveErrorChooseDialog chooseDialog = new SaveErrorChooseDialog(fileName, message, "${res:FileUtilityService.ErrorWhileLoading}", e, false)) {
switch (chooseDialog.ShowDialog()) {
case DialogResult.OK: // choose location (never happens here)
break;
case DialogResult.Retry:
return ObservedLoad(loadFile, fileName, message, policy);
case DialogResult.Ignore:
return FileOperationResult.Failed;
}
}
break;
}
}
return FileOperationResult.Failed;
}
public static FileOperationResult ObservedLoad(FileOperationDelegate loadFile, string fileName, FileErrorPolicy policy)
{
return ObservedLoad(loadFile,
fileName,
ResourceService.GetString("ICSharpCode.Services.FileUtilityService.CantLoadFileStandardText"),
policy);
}
public static FileOperationResult ObservedLoad(FileOperationDelegate loadFile, string fileName)
{
return ObservedLoad(loadFile, fileName, FileErrorPolicy.Inform);
}
class LoadWrapper
{
NamedFileOperationDelegate loadFile;
string fileName;
public LoadWrapper(NamedFileOperationDelegate loadFile, string fileName)
{
this.loadFile = loadFile;
this.fileName = fileName;
}
public void Invoke()
{
loadFile(fileName);
}
}
public static FileOperationResult ObservedLoad(NamedFileOperationDelegate saveFileAs, string fileName, string message, FileErrorPolicy policy)
{
return ObservedLoad(new FileOperationDelegate(new LoadWrapper(saveFileAs, fileName).Invoke), fileName, message, policy);
}
public static FileOperationResult ObservedLoad(NamedFileOperationDelegate saveFileAs, string fileName, FileErrorPolicy policy)
{
return ObservedLoad(saveFileAs,
fileName,
ResourceService.GetString("ICSharpCode.Services.FileUtilityService.CantLoadFileStandardText"),
policy);
}
public static FileOperationResult ObservedLoad(NamedFileOperationDelegate saveFileAs, string fileName)
{
return ObservedLoad(saveFileAs, fileName, FileErrorPolicy.Inform);
}
static void OnFileLoaded(FileNameEventArgs e)
{
if (FileLoaded != null) {
FileLoaded(null, e);
}
}
static void OnFileSaved(FileNameEventArgs e) {
if (FileSaved != null) {
FileSaved(null, e);
}
}
public static event FileNameEventHandler FileLoaded;
public static event FileNameEventHandler FileSaved;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -