最近因为要同步一些文件,发现Linux上传对文件的字符数量有限制,导致上传不成功,
平时都是使用Excel将文件完整路径提取出来,做截取文件名缩短处理,最后使用批处理来重命名文件.
经常这么操作,虽然不是太难,还感觉还是太麻烦了,本来想用Python写个工具,突然想用c#更直观方便点,花了点时间便做了这个工具
下面是主要的代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace RenFileName
{
public partial class RenFileName : Form
{
public RenFileName()
{
InitializeComponent();
}
private void Run_Click(object sender, EventArgs e)
{
string[] filePath;
int isSucces = 0;
int length = int.Parse(textBox_split.Text);
filePath = FilePath.Lines.Cast<string>().ToArray();
for (int i = 0; i < filePath.Length; i++)
{
//空白字符的跳出
if (filePath[i] == "")
{
continue;
}
string dirPath = Path.GetDirectoryName(filePath[i]);
string fileName = Path.GetFileName(filePath[i]);
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(filePath[i]);
string extension = Path.GetExtension(filePath[i]);
string sourceFileName = filePath[i];
string destFileName = Path.Combine(dirPath, string.Format("{0}{1}", ClipString(fileNameWithoutExtension, length), extension));
//判断文件是否存在
bool isFile = IsExistFile(filePath[i]);
if (isFile)
{
isSucces++;
File.Move(sourceFileName, destFileName);
}
}
InfoOut.Text = string.Format("已重命名记录: {0} 条", isSucces);
}
/// <summary>
/// 检测指定文件是否存在,如果存在则返回true。
/// </summary>
/// <param name="filePath">文件的绝对路径</param>
public static bool IsExistFile(string filePath)
{
return File.Exists(filePath);
}
/// <summary>
/// 截取指定长度字符串
/// </summary>
/// <param name="inputString">要处理的字符串</param>
/// <param name="len">指定长度</param>
/// <returns>返回处理后的字符串</returns>
public string ClipString(string inputString, int len)
{
bool isShowFix = false;
if (len % 2 == 1)
{
isShowFix = true;
len--;
}
System.Text.ASCIIEncoding ascii = new System.Text.ASCIIEncoding();
int tempLen = 0;
string tempString = "";
byte[] s = ascii.GetBytes(inputString);
for (int i = 0; i < s.Length; i++)
{
if ((int)s[i] == 63)
tempLen += 2;
else
tempLen += 1;
try
{
tempString += inputString.Substring(i, 1);
}
catch
{
break;
}
if (tempLen > len)
break;
}
byte[] mybyte = System.Text.Encoding.Default.GetBytes(inputString);
if (isShowFix && mybyte.Length > len)
tempString += "";
return tempString;
}
}
}
界面如下,一行一条路径,仅用于将文件名超长的截取为指定长度,并命名
VS工程代码