C# String EndsWith Returning True 问题
C# String EndsWith Returning True Issue
我正在使用“打开文件对话框”打开一个文件,我想确认该文件是 excel 格式。
我打开的文件是 "C:\Desktop\Distribution.xls",但我的 if 语句的两个条件评估为真。我应该使用另一种方法吗?
DialogResult result = openFileDialog1.ShowDialog();
if (result==DialogResult.OK)
{
file = openFileDialog1.FileName;
file = file.Trim();
if (!file.EndsWith(".xlsx")||!file.EndsWith(".xls"))
{
MessageBox.Show("Incorrect file format. Please save file in an .xls format");
}
else
{
book = application.Workbooks.Open(file);
sheet = (Worksheet)book.Worksheets[1];
range = sheet.get_Range("A1", "A1".ToString());
range.EntireRow.Delete(XlDirection.xlUp);
sheet.Cells[1, 2].EntireColumn.NumberFormat = "@";
book.SaveAs(csvConverstion, XlFileFormat.xlCSV);
book.Close(false, Type.Missing, Type.Missing);
application.Quit();
}
您需要使用“&&”而不是“||”
If 语句 Can't 永远是假的,因为你试图评估它同时以两个不同的字符串结尾(这是不可能的)。
你想说,"If file does not end in .xlsx and it also doesn't end with .xls, it is invalid"
替换为:
if (!file.EndsWith(".xlsx")||!file.EndsWith(".xls"))
有:
if (!file.EndsWith(".xlsx") && !file.EndsWith(".xls"))
替代解决方案:
使用更好读的结构,没有负数"IF",例如:
if (file.EndsWith(".xlsx") || file.EndsWith(".xls"))
{
//Do stuff
}
else
{
//Invalid
}
或者,如评论中所建议的那样:
string ext = Path.GetExtension(openFileDialog1.FileName);
if(ext.Equals(".xls") || ext.Equals(".xlsx"))
{
// Do stuff
}
else
{
// Invalid
}
条件 !file.EndsWith(".xlsx") || !file.EndsWith(".xls")
永远不会 return 为真。因为文件名不能同时以.xlsx
和.xls
结尾。
正确的条件是 "and" 运算符:!file.EndsWith(".xlsx") && !file.EndsWith(".xls")
.
尽量避免在 if 语句中使用否定句。如果你切换块,你可以像这样测试文件名是否有效
if (file.EndsWith(".xlsx")||file.EndsWith(".xls"))
{
book = application.Workbooks.Open(file);
sheet = (Worksheet)book.Worksheets[1];
range = sheet.get_Range("A1", "A1".ToString());
range.EntireRow.Delete(XlDirection.xlUp);
sheet.Cells[1, 2].EntireColumn.NumberFormat = "@";
book.SaveAs(csvConverstion, XlFileFormat.xlCSV);
book.Close(false, Type.Missing, Type.Missing);
application.Quit();
}
else
{
MessageBox.Show("Incorrect file format. Please save file in an .xls format");
}
它更易读,更容易理解。
只是另一个改进,太长了无法发表评论。如果要检查扩展名,请使用 System.IO.Path.GetExtension
。您可以将有效的扩展名存储在一个集合中。还要考虑扩展名可以是 .XLS
,它有效但不适用于您的代码。
string[] validExt = {".xls",".xlsx"};
string extension = System.IO.Path.GetExtension(openFileDialog1.FileName);
bool fileValid = validExt.Contains(extension, StringComparer.InvariantCultureIgnoreCase);
if(!fileValid)
{
// ...
}
除了大家所说的,您可能会发现 FileDialog.Filter
属性 有用。
您可以像这样使用它来限制允许的扩展名:
openFileDialog1.Filter = "Excel workbooks(*.xls;*.xlsx)|*.xls;*.xlsx";
这将只显示带有“.xls”和“.xlsx”扩展名的文件,让用户别无选择,只能 select 具有正确扩展名的文件。
此外,如果您决定验证文件扩展名,则应使用不区分大小写的比较,因为查找具有大写扩展名的路径非常常见(例如,"SomeName.XLSX")。您可以使用 String.Equals
方法来做到这一点:
string ext = System.IO.Path.GetExtension(file);
if (!string.Equals(ext, ".xls", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(ext, ".xlsx", StringComparison.OrdinalIgnoreCase))
{
//...
}
请注意,即使您使用了 FileDialog.Filter
,您可能仍需要确认 selected 文件在 FileDialog.FileOk
事件中具有正确的扩展名,因为 OpenFileDialog 可能允许 selecting 引用具有不同扩展名的文件的快捷方式,即使允许的扩展名受到 Filter
属性.
的限制
我正在使用“打开文件对话框”打开一个文件,我想确认该文件是 excel 格式。
我打开的文件是 "C:\Desktop\Distribution.xls",但我的 if 语句的两个条件评估为真。我应该使用另一种方法吗?
DialogResult result = openFileDialog1.ShowDialog();
if (result==DialogResult.OK)
{
file = openFileDialog1.FileName;
file = file.Trim();
if (!file.EndsWith(".xlsx")||!file.EndsWith(".xls"))
{
MessageBox.Show("Incorrect file format. Please save file in an .xls format");
}
else
{
book = application.Workbooks.Open(file);
sheet = (Worksheet)book.Worksheets[1];
range = sheet.get_Range("A1", "A1".ToString());
range.EntireRow.Delete(XlDirection.xlUp);
sheet.Cells[1, 2].EntireColumn.NumberFormat = "@";
book.SaveAs(csvConverstion, XlFileFormat.xlCSV);
book.Close(false, Type.Missing, Type.Missing);
application.Quit();
}
您需要使用“&&”而不是“||”
If 语句 Can't 永远是假的,因为你试图评估它同时以两个不同的字符串结尾(这是不可能的)。
你想说,"If file does not end in .xlsx and it also doesn't end with .xls, it is invalid"
替换为:
if (!file.EndsWith(".xlsx")||!file.EndsWith(".xls"))
有:
if (!file.EndsWith(".xlsx") && !file.EndsWith(".xls"))
替代解决方案:
使用更好读的结构,没有负数"IF",例如:
if (file.EndsWith(".xlsx") || file.EndsWith(".xls"))
{
//Do stuff
}
else
{
//Invalid
}
或者,如评论中所建议的那样:
string ext = Path.GetExtension(openFileDialog1.FileName);
if(ext.Equals(".xls") || ext.Equals(".xlsx"))
{
// Do stuff
}
else
{
// Invalid
}
条件 !file.EndsWith(".xlsx") || !file.EndsWith(".xls")
永远不会 return 为真。因为文件名不能同时以.xlsx
和.xls
结尾。
正确的条件是 "and" 运算符:!file.EndsWith(".xlsx") && !file.EndsWith(".xls")
.
尽量避免在 if 语句中使用否定句。如果你切换块,你可以像这样测试文件名是否有效
if (file.EndsWith(".xlsx")||file.EndsWith(".xls"))
{
book = application.Workbooks.Open(file);
sheet = (Worksheet)book.Worksheets[1];
range = sheet.get_Range("A1", "A1".ToString());
range.EntireRow.Delete(XlDirection.xlUp);
sheet.Cells[1, 2].EntireColumn.NumberFormat = "@";
book.SaveAs(csvConverstion, XlFileFormat.xlCSV);
book.Close(false, Type.Missing, Type.Missing);
application.Quit();
}
else
{
MessageBox.Show("Incorrect file format. Please save file in an .xls format");
}
它更易读,更容易理解。
只是另一个改进,太长了无法发表评论。如果要检查扩展名,请使用 System.IO.Path.GetExtension
。您可以将有效的扩展名存储在一个集合中。还要考虑扩展名可以是 .XLS
,它有效但不适用于您的代码。
string[] validExt = {".xls",".xlsx"};
string extension = System.IO.Path.GetExtension(openFileDialog1.FileName);
bool fileValid = validExt.Contains(extension, StringComparer.InvariantCultureIgnoreCase);
if(!fileValid)
{
// ...
}
除了大家所说的,您可能会发现 FileDialog.Filter
属性 有用。
您可以像这样使用它来限制允许的扩展名:
openFileDialog1.Filter = "Excel workbooks(*.xls;*.xlsx)|*.xls;*.xlsx";
这将只显示带有“.xls”和“.xlsx”扩展名的文件,让用户别无选择,只能 select 具有正确扩展名的文件。
此外,如果您决定验证文件扩展名,则应使用不区分大小写的比较,因为查找具有大写扩展名的路径非常常见(例如,"SomeName.XLSX")。您可以使用 String.Equals
方法来做到这一点:
string ext = System.IO.Path.GetExtension(file);
if (!string.Equals(ext, ".xls", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(ext, ".xlsx", StringComparison.OrdinalIgnoreCase))
{
//...
}
请注意,即使您使用了 FileDialog.Filter
,您可能仍需要确认 selected 文件在 FileDialog.FileOk
事件中具有正确的扩展名,因为 OpenFileDialog 可能允许 selecting 引用具有不同扩展名的文件的快捷方式,即使允许的扩展名受到 Filter
属性.