C#代码改文件名,求指教

lisa9342 2012-06-19 02:00:27
由于底层接收端限制文件名长度,所以发端发送文件时就要判断,若文件名超长,就截掉超过的那部分,只保留限制字符内的文件名,也就是改文件名。

限制是128字节(也就是汉字64个,字母或数字128个),包括文件后缀名,我想请问,有没有一种方法可以按限制长度来截取并重命名文件,但不修改文件路径。
...全文
560 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
E次奥 2012-06-20
  • 打赏
  • 举报
回复
这个问题不难吧。先转化成字节,在截取,再转化成字符串。没什么难度吧!
__天涯寻梦 2012-06-20
  • 打赏
  • 举报
回复
稍微修改下
var encoding = Encoding.GetEncoding("GB2312");
var path = "C:\\a\\一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一.txt";//153
var np = path;
while (encoding.GetByteCount(np) > 128)
{
var name = Path.GetFileNameWithoutExtension(np);
np = Path.GetDirectoryName(np).TrimEnd('\\') + "\\" + name.Substring(0, name.Length - 1) + Path.GetExtension(np);
}
File.Move(path, np);
var bytes = encoding.GetBytes(np);
__天涯寻梦 2012-06-20
  • 打赏
  • 举报
回复
这样
var encoding = Encoding.GetEncoding("GB2312");
var path = "C:\\一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一.txt";//153
while (encoding.GetByteCount(path) > 128)
{
var name = Path.GetFileNameWithoutExtension(path);
path = Path.GetDirectoryName(path) + "\\" + name.Substring(0, name.Length - 1) + Path.GetExtension(path);
}
var bytes = encoding.GetBytes(path);
lisa9342 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
我这样之后,错误:无法从byte[]转换为char[],那该怎么办呢?新的字节数组已经好了,就差把它编码成字符串了

byte[] newbytes = new byte[128];
Array.Copy(bytes, startByte, newbytes, 0, bytes.Length - 128);
String rename = new String(newbytes);……
[/Quote]

错了错了!这个错了!好乱呀!
我是想保留文件后缀名,从后缀名前一个字节算起,截掉超出的那些个字节,这可怎么办呀,乱死我了。
有没有人要帮帮我啊
lisa9342 2012-06-20
  • 打赏
  • 举报
回复
我这样之后,错误:无法从byte[]转换为char[],那该怎么办呢?新的字节数组已经好了,就差把它编码成字符串了

byte[] newbytes = new byte[128];
Array.Copy(bytes, startByte, newbytes, 0, bytes.Length - 128);
String rename = new String(newbytes);
lisa9342 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
String[] result = Directory.GetFiles(sourcePath, oldName);

foreach (String item in result) //foreach用于枚举集合的每个值,item表示当前值
{
string endstr = item.ToString().Substring(item.ToString().Length - ……
[/Quote]

谢谢!可是这里要限制的是字节数,不是字符数,怎么把字节数组裁了,再编码成新的字符串,赋给“endstr”?
「已注销」 2012-06-20
  • 打赏
  • 举报
回复
String[] result = Directory.GetFiles(sourcePath, oldName);

foreach (String item in result) //foreach用于枚举集合的每个值,item表示当前值
{
string endstr = item.ToString().Substring(item.ToString().Length - 6, 6);
File.Move(item, @sourcePath + endstr); //替换文件名
}
原理2楼说的有,这是我们项目里的简单写法。
lisa9342 2012-06-20
  • 打赏
  • 举报
回复
并把截取后的字节数组编码成新的字符串???
lisa9342 2012-06-20
  • 打赏
  • 举报
回复
现在还有一个问题就是,怎么把文件名的字节数组按字节给截取了?

foreach (string f in files)
{
string fullname = Path.GetFileName(f);//返回文件名和后缀名
string extn = Path.GetExtension(f);//返回文件后缀名
byte[] bytes = System.Text.Encoding.Default.GetBytes(fullname);
byte[] extnBytes = System.Text.Encoding.Default.GetBytes(extn);//获得文件后缀名的字节
string rename;//用于发送的新文件名
if (bytes.Length > 128)//判断全文件名的字节数
{
int startByte = CptStartByte(fullname, bytes.Length, extnBytes.Length);

rename = fullname.Remove(startByte, bytes.Length - 128);//这句肯定是错的啦,不过我就是想让大家了解我的意思,rename是截取后重新改的文件名


……
}
}

//这是我写的用于计算从哪个字节开始截取的方法,为了汉字,我判断了Index>127的时候再往前截一个字节
private int CptStartByte(string name, int byteLength, int extnByteLength)
{
int Index = byteLength - extnByteLength - (byteLength - 128);
int startIndex;
if (Index > 127)
startIndex = Index - 1;
else
startIndex = Index;
return startIndex;
}
lisa9342 2012-06-20
  • 打赏
  • 举报
回复
这是我综合大家的建议调试成功的最后结果:

string path = "C:\\a\\一一一一一一一一一一一一一一一一一一一一一一一一一一一.txt";
string newpath = path;
string fullname = Path.GetFileName(path);//返回文件名和后缀名
string extn = Path.GetExtension(path);//返回后缀名
string name = Path.GetFileNameWithoutExtension(path);//返回文件名
byte[] Bytes = System.Text.Encoding.Default.GetBytes(fullname);//获得文件名+后缀名的字节数组
byte[] nameBytes = System.Text.Encoding.Default.GetBytes(name);//获得文件名的字节数组
byte[] extnBytes = System.Text.Encoding.Default.GetBytes(extn);//获得后缀名的字节数组
string newname = fullname;//新(文件名+后缀名)
while (Bytes.Length > 128)
{
Common.ImportDllCom.SetProfile(Utils.LogName, "log", fullname + "(" + DateTime.Now.ToString("yyyyMMddHHmmss") + ")", "文件名长度超限");
int cutCount = Bytes.Length - 128;
byte[] newNameBytes = new byte[128];
Array.Copy(nameBytes, 0, newNameBytes, 0, nameBytes.Length - cutCount);//将文件名部分截取指定字节拷贝到新文件名数组
Array.Copy(extnBytes, 0, newNameBytes, nameBytes.Length - cutCount, extn.Length);//将后缀名部分拷贝到新文件名数组
newname = System.Text.Encoding.Default.GetString(newNameBytes);//将新文件名数组编码成字符串
newpath = Path.GetDirectoryName(path).TrimEnd('\\') + "\\" + newname;
break;
}
File.Move(path, newpath);//改文件名
LOVE_GG 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

改名用FileInfo 的 MoveTo(截取后的文件名)
http://www.cnblogs.com/ylemzhang/archive/2010/10/11/1848120.html
[/Quote]
+1.
其实就是把原来的文件,移动到另一个路径,且名字不同,只是这里移动到同一个目录下而已
bdmh 2012-06-19
  • 打赏
  • 举报
回复
改名用FileInfo 的 MoveTo(截取后的文件名)
http://www.cnblogs.com/ylemzhang/archive/2010/10/11/1848120.html
ParanoidKing 2012-06-19
  • 打赏
  • 举报
回复
那如果文件路径本身就超过限制了呢?

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧