C#String EndsWith返回真实问题

时间:2018-05-02 15:51:52

标签: c# ends-with

我正在使用OpenFile对话框打开一个文件,我想确认该文件是excel格式。

我打开的文件是“C:\ Desktop \ Distribution.xls”,但我的if语句的两个条件都评估为true。我应该使用另一种方法吗?

          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();

            }

5 个答案:

答案 0 :(得分:5)

您需要使用“&&”而不是“||”

If语句不能永远是假的,因为你试图评估它同时以两个不同的字符串结束(这是不可能的)。

希望说:“如果文件没有以.xlsx 结尾,它也不会以.xls结尾,那么它就无效了”

替换它:

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
}

答案 1 :(得分:2)

条件!file.EndsWith(".xlsx") || !file.EndsWith(".xls")无法返回true。因为文件名不能以.xlsx.xls结束。

正确的条件是使用“和”运算符:!file.EndsWith(".xlsx") && !file.EndsWith(".xls")

答案 2 :(得分:1)

尽量避免if语句中的否定。如果您切换块,您可以进行测试以查看文件名是否有效,如此

TreeView tv = new TreeView();

for (int i=0; i < 10; i++)
{
    TreeNode node = new TreeNode(i.ToString());
    for (int j = 0; j < 10; j++) node.Nodes.Add(j.ToString());

    tv.Nodes.Add(node);
}

int count = CountTreeNodes(tv.Nodes);

它更易读,更容易理解。

答案 3 :(得分:1)

另一项改进对于评论来说太长了。如果要查看扩展名,请使用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)
{
   // ...
}

答案 4 :(得分:1)

除了每个人都说过的内容之外,您可能会发现FileDialog.Filter属性很有用。

您可以使用它来限制允许的扩展名,如下所示:

string ext = System.IO.Path.GetExtension(file);
if (!string.Equals(ext, ".xls", StringComparison.OrdinalIgnoreCase) &&
    !string.Equals(ext, ".xlsx", StringComparison.OrdinalIgnoreCase))
{
    //...
}

这只会显示带有“.xls”和“.xlsx”扩展名的文件,让用户别无选择,只能选择具有正确扩展名的文件。

此外,如果您决定验证文件扩展名,则应使用不区分大小写的比较,因为查找带有大写扩展名的路径非常常见(例如,“SomeName.XLSX”)。您可以使用String.Equals方法执行此操作:

FileDialog.Filter

请注意,即使您使用了Filter,您仍可能需要确认所选文件在FileDialog.FileOk事件中具有正确的扩展名,因为OpenFileDialog可以允许选择引用具有不同扩展名的文件的快捷方式即使允许的扩展名受{{1}}属性的限制。