C# 如何更新其他两列中基于文件名的文件名的最大值
我需要根据其他两列中文件名的最高名称更新文件名。 例如:-我有一个coumn3叫C# 如何更新其他两列中基于文件名的文件名的最大值,c#,wpf,filenames,C#,Wpf,Filenames,我需要根据其他两列中文件名的最高名称更新文件名。 例如:-我有一个coumn3叫221-8812\u 01,第4列叫221-8812\u 02。因此,我想将221-8812_02文件名更新为第1列 反之亦然,如果我在第3列中有一个名为323-1111_03的文件名,在第3列中有一个名为323-1111_02,那么我想在第1列中更新323-1111_03 注意:- 我有像323-2332_0A和323-2332_0B这样的文件名。所以我需要更新第1列中的323-2332_0B。 或者可能是111-
221-8812\u 01
,第4列叫221-8812\u 02
。因此,我想将221-8812_02
文件名更新为第1列
反之亦然,如果我在第3列中有一个名为323-1111_03
的文件名,在第3列中有一个名为323-1111_02
,那么我想在第1列中更新323-1111_03
注意:-
我有像323-2332_0A和323-2332_0B这样的文件名。所以我需要更新第1列中的323-2332_0B。
或者可能是111-4334_0D和111-4334_0C,因此我需要更新到第1列
所以它的第一个服务器号保持不变。七个数字之后。。当(41;下划线开始时。。我需要比较一下。。按字母或数字的递增顺序排列!!!!
我该怎么做呢
我的代码片段:
private void filter_table()
{
// create a check box in column0
DataGridViewCheckBoxColumn colCB = new DataGridViewCheckBoxColumn();
DatagridViewCheckBoxHeaderCell cbHeader = new DatagridViewCheckBoxHeaderCell();
colCB.HeaderCell = cbHeader;
dataGridView1.Columns.Add(colCB);
//Initialize Directory path
string draft = ini.ReadValue("Location", "Draft");
string release = ini.ReadValue("Location", "Release");
string drawing = ini.ReadValue("Location", "Drawing");
string archive = ini.ReadValue("Location", "Archive");
if (!System.IO.Directory.Exists(draft))
System.IO.Directory.CreateDirectory(draft);
if (!System.IO.Directory.Exists(release))
System.IO.Directory.CreateDirectory(release);
if (!System.IO.Directory.Exists(drawing))
System.IO.Directory.CreateDirectory(drawing);
if (!System.IO.Directory.Exists(archive))
System.IO.Directory.CreateDirectory(archive);
string[] arrDraft = Directory.GetFiles(draft, "*", SearchOption.AllDirectories);
string[] arrRelease = Directory.GetFiles(release, "*", SearchOption.AllDirectories);
string[] arrDrawing = Directory.GetFiles(drawing, "*", SearchOption.AllDirectories);
string[] arrArchive = Directory.GetFiles(archive, "*", SearchOption.AllDirectories);
dt.Columns.Add("Drawing_Number");
//dt.Columns["Part Number"].ReadOnly = true;
dt.Columns.Add("Drawing");
// dt.Columns["Drawing"].ReadOnly = true;
dt.Columns.Add("Draft Path");
// dt.Columns["Draft Path"].ReadOnly = true;
dt.Columns.Add("Release Path");
// dt.Columns["Release Path"].ReadOnly = true;
dt.Columns.Add("Error");
// dt.Columns["Error"].ReadOnly = true;
dt.Columns.Add("Archive");
// listing all the files according to the column3(draft path) filename.. and mating files from nearby column.
List<FileDetails> lst = new List<FileDetails>();
foreach (string file in arrDraft)
{
Finder finder = new Finder(Path.GetFileNameWithoutExtension(file).Substring(0, 7));
string abc = Array.Find(arrRelease, finder.Match);
string cdf = Array.Find(arrDrawing, finder.Match);
string ghi = Array.Find(arrArchive, finder.Match);
dt.Rows.Add(Path.GetFileNameWithoutExtension(file), cdf, file, abc, String.Empty, ghi);
}
dataGridView1.DataSource = dt;
}
private void Form1_Load(object sender, EventArgs e)
{
filter_table();
}
// Search predicate returns true if a string ends in "saurus".
private static bool MatchFileName(String s, String _match)
{
return ((s.Length > 5) && (s.Substring(0, 7).ToLower() == _match.ToLower()));
}
public class FileDetails
{
public string FileName;
public string Drawings;
public string FilePathDraft;
public string FilePathRelease;
public string Comment;
public string ErrorMsg;
}
public sealed class Finder
{
private readonly string _match;
public Finder(string match)
{
_match = match.ToLower();
}
//findin the match and showing in grid view
public bool Match(string s)
{
string fileName = s.Substring(s.LastIndexOf("\\") + 1);
return ((fileName.Length > 5) && (fileName.Substring(0, 8).ToLower() == _match));
}
}
private void filter_table()
{
//在第0列中创建复选框
DataGridViewCheckBoxColumn colCB=新DataGridViewCheckBoxColumn();
DatagridViewCheckBoxHeaderCell cbHeader=新DatagridViewCheckBoxHeaderCell();
colCB.HeaderCell=cbHeader;
dataGridView1.Columns.Add(colCB);
//初始化目录路径
字符串draft=ini.ReadValue(“位置”、“草稿”);
字符串release=ini.ReadValue(“位置”、“释放”);
字符串绘图=ini.ReadValue(“位置”、“绘图”);
string archive=ini.ReadValue(“位置”、“存档”);
如果(!System.IO.Directory.Exists(草稿))
System.IO.Directory.CreateDirectory(草稿);
如果(!System.IO.Directory.Exists(release))
System.IO.Directory.CreateDirectory(发布版);
如果(!System.IO.Directory.Exists(绘图))
System.IO.Directory.CreateDirectory(绘图);
如果(!System.IO.Directory.Exists(archive))
System.IO.Directory.CreateDirectory(归档);
字符串[]arrDraft=Directory.GetFiles(草稿,“*”,SearchOption.AllDirectories);
字符串[]arrelease=Directory.GetFiles(release,“*”,SearchOption.AllDirectories);
字符串[]arrrawing=Directory.GetFiles(绘图“*”,SearchOption.AllDirectories);
字符串[]arrArchive=Directory.GetFiles(存档,“*”,SearchOption.AllDirectories);
dt.列。添加(“图纸编号”);
//dt.列[“零件号”]。只读=真;
dt.列。添加(“图纸”);
//dt.列[“图纸”]。只读=真;
dt.Columns.Add(“草稿路径”);
//dt.Columns[“草稿路径”].ReadOnly=true;
dt.Columns.Add(“发布路径”);
//dt.Columns[“发布路径”]。ReadOnly=true;
dt.Columns.Add(“错误”);
//dt.列[“错误”]。只读=真;
dt.列。添加(“存档”);
//根据column3(草稿路径)文件名..列出所有文件,并从附近的列中列出匹配文件。
List lst=新列表();
foreach(草稿中的字符串文件)
{
Finder=newfinder(Path.getfilenamwithoutextension(file.Substring(0,7));
字符串abc=Array.Find(arrelease,finder.Match);
字符串cdf=Array.Find(arrDrawing,finder.Match);
字符串ghi=Array.Find(arrArchive,finder.Match);
添加(Path.GetFileNameWithoutExtension(file),cdf,file,abc,String.Empty,ghi);
}
dataGridView1.DataSource=dt;
}
私有void Form1\u加载(对象发送方、事件参数e)
{
过滤表();
}
//如果字符串以“saurus”结尾,则搜索谓词返回true。
私有静态布尔匹配文件名(字符串s,字符串_匹配)
{
返回((s.Length>5)和&(s.Substring(0,7).ToLower()==_match.ToLower());
}
公共类文件详细信息
{
公共字符串文件名;
公共弦图;
公共字符串文件路径草稿;
公共字符串FilePathRelease;
公共字符串评论;
公共字符串ErrorMsg;
}
公共密封类查找器
{
私有只读字符串_匹配;
公共查找器(字符串匹配)
{
_match=match.ToLower();
}
//在匹配中查找并在网格视图中显示
公共布尔匹配(字符串s)
{
字符串文件名=s.Substring(s.LastIndexOf(“\\”)+1);
返回((fileName.Length>5)和&(fileName.Substring(0,8.ToLower()=_match));
}
}
我想出了一个快速而简单的方法来比较两个字符串,并根据您的逻辑确定哪个更高
请注意:
323-1111_0D
323-1111_FF
- 您可能希望修改此代码并改为实现IComparable
- 如果您喜欢将代码用作下面这样的静态方法,则需要处理两个字符串相等的情况
- 如果您确信前7个数字始终相同,则可以省略该逻辑
- 我的逻辑假设位置是固定的。如果位置是动态的,则需要修改代码以使用string.IndexOf(“\u”)
让我们轻松一点
输出:string A = "323-1111_0A"; string B = "323-1111_0D"; MessageBox.Show(TakeLarger(A, B)); private string TakeLarger(string first, string second) { int iResult = first.Substring(first.LastIndexOf("_")+1).CompareTo(second.Substring(second.LastIndexOf("_")+1)); return (iResult == -1) ? second : first; }
323-1111_0D
323-1111_FF
如果最后两位是十六进制值,则可以使用此方法
输出:string A = "323-1111_FF"; string B = "323-1111_1D"; MessageBox.Show(TakeLarger(A, B)); private string TakeLargerHex(string first, string second) { int iFirst = Convert.ToInt32(first.Substring(first.LastIndexOf("_")+1), 16); int iSecond = Convert.ToInt32(second.Substring(second.LastIndexOf("_")+1), 16); return (iFirst > iSecond) ? first : second; }
323-1111_0D
如果文件名存储在网格单元中,如323-1111_FF
,则需要从末尾删除扩展名,否则可以直接获取MY_file_323-1111_FF.doc
如果扩展名包含在字符串的末尾,则可以这样删除string A = dataGridView.Rows[i].Cells[2].Value.ToString(); string B = dataGridView.Rows[i].Cells[3].Value.ToString();
A = A.Substring(A.LastIndexOf(".")+1);
为什么
比323-2332_0B
高,但是323-2332_0A
比111-4334_0C
高?@DourHighArch我在找_0A,0B,0C。。继续。到0Z。。而在数字上它就像_01,02,03,04,05,06,07。。在最后两个月numbers@Shell.. 任何身份证111-4334_0D