C#中String.EndsWith返回True异常:Excel格式验证失效问题
Excel文件格式验证问题的解决方案
嘿,我一眼就看出你的问题出在逻辑运算符的误用上!咱们先拆解下原代码里的问题:
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...."); } }
你用了||(逻辑或),这意味着只要两个条件里有一个为true,整个判断就会成立。比如你打开的是.xls文件,!file.EndsWith(".xlsx")肯定是true,所以不管它是不是合法的.xls,都会触发错误提示——这就是为什么你觉得两个条件都判定为true的原因!
修正方案1:修复逻辑判断
把||换成&&(逻辑与),意思是既不是.xlsx也不是.xls的时候才提示错误,这样逻辑就完全通顺了。另外建议加上忽略大小写的判断,避免用户上传.XLSX这类大写后缀的文件被误判:
DialogResult result = openFileDialog1.ShowDialog(); if (result == DialogResult.OK) { file = openFileDialog1.FileName.Trim(); // 修正逻辑:同时不满足两个后缀时才提示错误 if (!file.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase) && !file.EndsWith(".xls", StringComparison.OrdinalIgnoreCase)) { MessageBox.Show("Incorrect file format...."); } }
修正方案2:从源头限制文件类型
更高效的方式是直接给OpenFileDialog设置筛选器,让用户只能选择Excel文件,从一开始就避免选错:
// 先设置文件筛选器 openFileDialog1.Filter = "Excel 文件|*.xls;*.xlsx"; DialogResult result = openFileDialog1.ShowDialog(); if (result == DialogResult.OK) { file = openFileDialog1.FileName.Trim(); // 此时基本无需额外验证,除非担心用户手动修改文件后缀 }
进阶方案:验证文件真实内容(魔法字节)
如果担心用户修改文件后缀(比如把.txt改成.xls冒充Excel文件),可以通过检查文件的魔法字节(文件开头的特征字节)来验证真实格式:
.xls文件的开头字节是0xD0, 0xCF, 0x11, 0xE0.xlsx文件的开头字节是0x50, 0x4B, 0x03, 0x04(因为xlsx本质是压缩包)
示例代码:
private bool IsValidExcelFile(string filePath) { using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { byte[] header = new byte[4]; stream.Read(header, 0, 4); // 匹配xls或xlsx的特征字节 bool isXls = header.SequenceEqual(new byte[] { 0xD0, 0xCF, 0x11, 0xE0 }); bool isXlsx = header.SequenceEqual(new byte[] { 0x50, 0x4B, 0x03, 0x04 }); return isXls || isXlsx; } } // 使用方法 DialogResult result = openFileDialog1.ShowDialog(); if (result == DialogResult.OK) { file = openFileDialog1.FileName.Trim(); if (!IsValidExcelFile(file)) { MessageBox.Show("Incorrect file format...."); } }
这种方式能彻底规避后缀造假的情况,验证结果更准确。
内容的提问来源于stack exchange,提问作者Nicole
相关产品推荐
相关产品推荐

