题目要求
输入的字符串必须包含文件路径、文件名和文件扩展名,将这三类分别拆解输出。
输入格式
D:\CSDN.NET\C#编程实践\拆解输入的文件路径(学习笔记).docx
输出格式
文件路径:D:\CSDN.NET\C#编程实践
文件名:拆解输入的文件路径(学习笔记)
扩展名:docx
编程平台
Visual Studio 2017 控制台
代码实现
初始版代码
/* 思路:倒序检查输入的字符串。 */
string input = Console.ReadLine(); // 获取用户输入
int i = 0;
for (i = input.Length - 1; i >= 0; --i) // 寻找'.'
{
if (input[i] == '.')
{
break;
}
}
if (i != -1 && i != input.Length - 1) // 存在'.'且'.'不是位于最后一个字符
{
int j = 0;
for (j = i - 1; j >= 0; --j) // 寻找'.'前面有没有的'\'
{
if (input[j] == '\\')
{
break;
}
}
if (j != -1) // 说明有'\'
{
if (i - 1 - j != 0) // 说明字符串最后一个'\'和'.'中间有内容
{
string extensionName = input.Substring(i + 1, input.Length - 1 - i);
string fileName = input.Substring(j + 1, i - 1 - j);
string filePath = input.Substring(0, j + 1);
Console.WriteLine("文件路径:{0}", filePath);
Console.WriteLine("文件名:{0}", fileName);
Console.WriteLine("扩展名:{0}", extensionName);
}
else
{
Console.WriteLine("您输入的字符串没有文件名!");
}
}
else
{
Console.WriteLine("您输入的字符串没有文件路径!");
}
}
else
{
Console.WriteLine("您输入的字符串没有扩展名!");
}
// 不足:判断分支过多,不易理解。
改进版代码
/* 思路:先假设输入的字符串符合题意,直接拆解字符串,拆解过程失败或拆解结果为空则报错。 */
try
{
string input = Console.ReadLine(); // 获取用户输入
string filePath = input.Substring(0, input.LastIndexOf('\\') + 1);
string fileName = input.Substring(input.LastIndexOf('\\') + 1,
input.LastIndexOf('.') - input.LastIndexOf('\\') - 1);
string extensionName = input.Substring(input.LastIndexOf('.') + 1,
input.Length - input.LastIndexOf('.') - 1);
if (filePath == "" || fileName == "" || extensionName == "")
{
Console.WriteLine("您输入的字符串不是一个合法的地址!");
}
else // 拆解成功,说明是合法地址
{
Console.WriteLine("文件路径:{0}", filePath);
Console.WriteLine("文件名:{0}", fileName);
Console.WriteLine("扩展名:{0}", extensionName);
}
}
catch (Exception e)
{
Console.WriteLine("您输入的字符串不是一个合法的地址!");
}
// 不足:报错提示笼统,无法指明直接错误。
优化版代码
/* 思路:逐步检查字符串是否符合要求,并用临时变量记录是否有错误。 */
string input = Console.ReadLine(); // 获取用户输入
bool hasError = false;
if (!input.Contains("\\")) // 文件路径中一定有‘\’
{
Console.WriteLine("您输入的地址没有文件路径!");
hasError = true;
}
if (!Regex.IsMatch(input.Substring(input.LastIndexOf(".") + 1), "^[a-zA-Z0-9]+$"))
// 扩展名一定由一个或多个数字或字母组成
{
Console.WriteLine("您输入的地址没有扩展名!");
hasError = true;
}
if (input.LastIndexOf('.') - input.LastIndexOf('\\') - 1 == 0)
// 检查最后一个‘\’和‘.’之间一定有字符
{
Console.WriteLine("您输入的地址没有文件名!");
hasError = true;
}
if (hasError == false) // 说明是一个合法的地址,可以进行拆解
{
string filePath = input.Substring(0, input.LastIndexOf('\\') + 1);
string fileName = input.Substring(input.LastIndexOf('\\') + 1,
input.LastIndexOf('.') - input.LastIndexOf('\\') - 1);
string extensionName = input.Substring(input.LastIndexOf('.') + 1,
input.Length - input.LastIndexOf('.') - 1);
Console.WriteLine("文件路径:{0}", filePath);
Console.WriteLine("文件名:{0}", fileName);
Console.WriteLine("扩展名:{0}", extensionName);
}
如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!