方法DeleteTester应从TestingCompany.txt中删除选定测试人员的行 如果测试仪已经分配到设备测试仪,则不应删除。
我的代码无法正常运行。将测试仪分配给设备时,会显示错误消息“此测试公司已分配给设备”并删除测试仪。不应删除测试程序。
public void DeleteTester(string testerData)
{
string line_to_delete = testerData;
string[] line_to_Delete_Array= theEntity.setString(line_to_delete);
string testerToDelete = line_to_Delete_Array[0];
foreach (var line in File.ReadLines(@"C:\\Temp\\Equipment.txt"))
if (line.EndsWith(testerToDelete, StringComparison.CurrentCultureIgnoreCase))
{
MessageBox.Show("This testing company is assigned to Equipment", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
string strFilePath = @"C:\\Temp\\TestingCompany.txt";
string strSearchText = testerData;
string strOldText;
string n = "";
StreamReader sr = File.OpenText(strFilePath);
while ((strOldText = sr.ReadLine()) != null)
{
if (!strOldText.Contains(strSearchText))
{
n += strOldText + Environment.NewLine;
}
}
sr.Close();
File.WriteAllText(strFilePath, n);
}
}
方法setString从文件
中的行返回数组public string[] setString(string newString)
{
sString = newString;
setStrings = sString.Split(',');
return setStrings;
}
设备文件包含分隔符“,”
的信息1,voltmeter,25/07/2017,1
2,multimeter,31/08/2017,2
3,ampermeter,31/07/2016,3
4,voltmeter,29/08/2016,1
测试公司文件数据
1,Testing Ltd,2 New North Rd,Auckland,2678
2,Q Testing Ltd, 4 Dominion Street,Auckland,5678
3,Metrology Limited,2 Dominos St,Christchurch,3456
DeleteTester()
private void btnDeleteTester_Click(object sender, EventArgs e)
{
string deleteTester = lstTestingCompanies.GetItemText(lstTestingCompanies.SelectedItem);
theController.DeleteTester(deleteTester);
}
deleteTester有一个数据1,Testing Ltd,2 New North Rd,Auckland,2678
固定代码它有效,但它只是一种模式而且设计不合理
public void DeleteTester(string testerData)
{
string line_to_delete = testerData;
string[] line_to_Delete_Array = theEntity.setString(line_to_delete);
string testerToDelete = line_to_Delete_Array[0];
string[] checkEquipment = File.ReadAllLines(@"C:\\Temp\\Equipment.txt");
foreach (string s in checkEquipment)
{
string[] TesterToDelete = theEntity.setString(s);
if (Convert.ToInt32(TesterToDelete[3]) == Convert.ToInt32(testerToDelete))
{
MessageBox.Show("This testing company is assigned to Equipment", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
flag = 1;
break;
}
}
if (flag != 1)
{
string strSearchText = testerData;
string strOldText;
string n = "";
StreamReader sr = File.OpenText(@"C:\\Temp\\TestingCompany.txt");
while ((strOldText = sr.ReadLine()) != null)
{
if (!strOldText.Contains(strSearchText))
{
n += strOldText + Environment.NewLine;
}
}
sr.Close();
File.WriteAllText(@"C:\\Temp\\TestingCompany.txt", n);
}
}
答案 0 :(得分:2)
以下是您的代码的固定版本,可以完成预期的工作。也就是说,如果传递的第一个字符串数未分配给设备文件中的任何设备,它将从公司文件中删除该行。
我删除了一堆冗余代码并将其清理干净。 首先,在打开文件时执行大量其他操作不是一个好习惯。相反,阅读内容,关闭文件,然后执行您的工作,如果需要将其写回文件,请再次打开并写入。除非你有充分的理由不这样做。
public static void DeleteTester(string testerData)
{
string[] line_to_Delete_Array = testerData.Split(',');
string testerToDelete = line_to_Delete_Array[0];
string equipmentFile = @"C:\Temp\Equipment.txt";
string companyFile = @"C:\Temp\TestingCompany.txt";
var equipmentData = File.ReadLines(equipmentFile);
var companyData = File.ReadLines(companyFile);
foreach (var line in equipmentData)
{
if (line.EndsWith(testerToDelete, StringComparison.CurrentCultureIgnoreCase))
{
Console.WriteLine("This testing company is assigned to Equipment");
break;
}
else
{
var finalList = new List<string>();
foreach(var company in companyData)
{
if (!company.Contains(testerData))
finalList.Add(company);
}
File.WriteAllLines(companyFile, finalList.ToArray());
break;
}
}
}
P.S。
您得到此测试公司已分配到设备消息,因为您传递的测试数据在开头有1
,1
是分配给设备中设备的编号文件,因此它永远不会进入你的else
声明。在运行此代码之前,请尝试将设备文件更改为以下内容。
1,电压表,25/07 / 2017,555
2,万用表,31/08 / 2017,2
3,ampermeter,31/07 / 2016,3
4,电压表,29/08 / 2016,555
HOWEVER
正如许多其他人所指出的那样,你的方法 非常 脆弱,可能会在很多地方出错。
建议1
在按钮单击事件中,不是获取整行测试并将其传递给DeleteTester()
函数,而是提取数字(在示例字符串中,只需1
)并将其作为integer
。
然后在DeleteTester()
函数中使用某种适当的CSV阅读器来读取您的设备文件,并在每行末尾隔离参考号,然后将转换为integer
。
现在,不是line.EndsWith()
,而是进行integer
比较,看看它是否存在。
然后,在else
中,再次使用CSV阅读器并隔离每行中的第一个数字,将其转换为int
,如果匹配,则删除您的行。
建议2
即使这不是一个非常好的方法。如果你真的想要彻底,我认为你应该使用数据库,或者如果这是一个过度的,至少结构良好的XML文件,来存储你的数据。