我有一个FTP服务器,它将客户端发送/上传的文件存储在某个文件夹中。客户端将上传3个具有相同名称但不同扩展名的文件。例如,客户端将发送file1.ext1、file1。Ext2和file1.ext3。我正在寻找一段代码,这将帮助我找到具有相同名称的文件("file1"),然后压缩它们。任何帮助都是感激的。我已经编写了这段代码,它获取文件夹中所有文件的名称:
string path = "somepath";
String[] FileNames = Directory.GetFiles(path);
这很简单:
string path = "somepath";
String[] FileNames = Directory.GetFiles(path);
您可以使用LINQ按文件名对文件进行分组,不需要扩展名:
var fileGroups = from f in FileNames
group f by Path.GetFileNameWithoutExtension(f) into g
select new { Name = g.Key, FileNames = g };
// each group will have files with the
// same name and different extensions
foreach (var g in fileGroups)
{
// initialize zip file
foreach (var fname in g.FileNames)
{
// add fname to zip
}
// close zip file
}
更新如果你没有LINQ,这个任务也不会太难。首先,要对文件进行排序:
Array.Sort(FileNames);
现在,您有了一个按文件名排序的文件列表。例如:
file1.ext1
file1.ext2
file1.ext3
file2.ext1
file2.ext2
etc...
然后浏览列表,将具有相同基本名称的文件添加到zip文件中,如下所示。注意,我不知道您是如何创建zip文件的,所以我只创建了一个简单的ZipFile
类。当然,你需要用你正在使用的任何东西来替换它。
string lastFileName = string.Empty;
string zipFileName = null;
ZipFile zipFile = null;
for (int i = 0; i < FileNames.Length; ++i)
{
string baseFileName = Path.GetFileNameWithoutExtension(FileNames[i]);
if (baseFileName != lastFileName)
{
// end of zip file
if (zipFile != null)
{
// close zip file
ZipFile.Close();
}
// create new zip file
zipFileName = baseFileName + ".zip";
zipFile = new ZipFile(zipFileName);
lastFileName = baseFileName;
}
// add this file to the zip
zipFile.Add(FileNames[i]);
}
// be sure to close the last zip file
if (zipFile != null)
{
zipFile.Close();
}
我不知道紧凑框架是否有Path.GetFileNameWithoutExtension
方法。如果没有,则可以通过以下方式获得不带扩展名的名称:
string filename = @"c:dirsubdirfile.ext";
int dotPos = filename.LastIndexOf('.');
int slashPos = filename.LastIndexOf('\');
string ext;
string name;
int start = (slashPos == -1) ? 0 : slashPos+1;
int length;
if (dotPos == -1 || dotPos < slashPos)
length = filename.Length - start;
else
length = dotPos - start;
string nameWithoutExtension = filename.Substring(start, length);
在呼叫GetFiles
时使用星号通配符作为文件扩展名,例如:
List<string> files = Directory.GetFiles(pathName, "SpecificFileName.*");
或:
string[] files = Directory.GetFiles(pathName, "SpecificFileName.*");
您可以尝试下面的代码。这也可以解决文件名本身是否有点的问题。
string[] fileNames = Directory.GetFiles(path);
List<string> fileNamesWithoutExtension = new List<string>();
List<string> myFiles = new List<string>();
string myFile = mySearchFileWithoutExtension;
foreach (string s in fileNames)
{
char[] charArray = s.ToCharArray();
Array.Reverse(charArray);
string s1 = new string(charArray);
string[] ext = s1.Split(new char[] { '.' }, 2);
if ((ext.Length > 1))
{
char[] charArray2 = ext[1].ToCharArray();
Array.Reverse(charArray2);
fileNamesWithoutExtension.Add(new string(charArray2));
if ((new string(charArray2)).Trim().Equals(myFile))
{
myFiles.Add(s);
}
}
}
没有扩展名的文件列表:fileNamesWithoutExtension
所需的文件集:myFiles