我最终做的是编写一个使用 OpenFileDialog 的方法,但间接检查路径字符串的长度。也就是说,如果该方法失败,则会向用户显示一个错误,告诉他们文件太多,然后显示一个 FolderBrowser,其中包含用户正在查看的所选文件夹。我还添加了单独的选项来导入文件或导入菜单栏中的文件夹。
这是执行此操作的代码。这些是名为 DataFileIO 的静态类中的方法,我将所有自定义 IO 内容用于写入 excel 或 access 或 xml 等。
public static string[] GetFiles()
{
string[] fileNames;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.InitialDirectory = UniversalDataImporter.Properties.Settings.Default.openFilePath;
openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
openFileDialog1.FilterIndex = 2;
openFileDialog1.RestoreDirectory = false;
openFileDialog1.Multiselect = true;
openFileDialog1.CheckFileExists = false;
try
{
DialogResult result = openFileDialog1.ShowDialog();
if (result == DialogResult.OK && openFileDialog1.FileNames.Count() <501 )
{
UniversalDataImporter.Properties.Settings.Default.openFilePath =
Path.GetDirectoryName(openFileDialog1.FileName);
UniversalDataImporter.Properties.Settings.Default.Save();
return fileNames = openFileDialog1.FileNames;
}
else if (result == DialogResult.Cancel)
{
return null;
}
else
{
if (MessageBox.Show("Too many files were Selected. Would you like to import a folder instead?",
"Too many files...", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
return fileNames = GetFilesInFolder();
}
else
{
return null;
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
return null;
}
}
public static string[] GetFilesInFolder()
{
FileInfo[] fileInfo;
string pathName;
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
folderBrowserDialog.RootFolder = System.Environment.SpecialFolder.Desktop;
DialogResult results = folderBrowserDialog.ShowDialog();
if (results == DialogResult.OK)
{
try
{
pathName = folderBrowserDialog.SelectedPath;
DirectoryInfo dir = new DirectoryInfo(pathName);
if (dir.Exists)
{
fileInfo = dir.GetFiles();
string[] fileNames = new string[fileInfo.Length];
for (int i = 0; i < fileInfo.Length; i++)//this is shit
{
fileNames[i] = fileInfo[i].FullName;
}
return fileNames;
}
else
{
return null;
}
}
catch (Exception ex)
{
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
return null;
}
}
else if (results == DialogResult.Cancel)
{
return null;
}
else { return null; }
}