using System;using System.Linq;
public static class Program
private static string seperator = "~";
private const int leadingnumbers = 5;
public static string TrimMidFileNameFormat(this string filename, int maxFileLen)
Console.Write(string.Format("{0,5:###}", maxFileLen)+" ");
string ext = filename.GetFileNameExtension();
string filenamelessext = filename.Substring(0, filename.Length - extLen);
int filenamelessextLen = filenamelessext.Length;
int maxroom = Math.Min(leadingnumbers * 2 - 1, filenamelessextLen);
int minLen = 2 + 1 + extLen;
int lastLen = 1 + extLen;
if (filename.Length <= maxFileLen)
else if (filename.Length < minLen)
else if (maxFileLen < minLen)
return filename.Substring(0, 1) + seperator + filename.Substring(filename.Length-lastLen, lastLen);
else if (maxFileLen >= minLen && maxFileLen < (maxroom + minLen))
int room = (maxFileLen - lastLen);
int one3rd = (3 + room - 1) / 3;
int two3rds = room - one3rd;
return filename.Substring(0, one3rd) + seperator + filename.Substring(filename.Length-(two3rds + lastLen), (two3rds + lastLen));
else if (filename.Length > maxFileLen + leadingnumbers + 1)
return filename.Substring(0, leadingnumbers) + seperator + filename.Substring(filename.Length - maxFileLen, maxFileLen);
private static Random random = new Random();
public static string RandomString(int length)
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^*-.";
return new string(Enumerable.Repeat(chars, length)
.Select(s => s[random.Next(s.Length)]).ToArray());
public static string GetFileNameExtension(this string s)
int fileExtPos = s.LastIndexOf('.');
if (fileExtPos > s.LastIndexOf('\\'))
ext = s.Substring(fileExtPos, s.Length - fileExtPos);
if (ext.Length <= 1) ext = "";
public static void Main()
for (int j = 1; j < 41; j++) {
filename = RandomString(j) + ".exe";
Console.WriteLine(filename); Console.WriteLine("Length=" + filename.Length); Console.WriteLine();
for (int i = -1; i < filename.Length+3; i++)
Console.WriteLine(filename.TrimMidFileNameFormat(i));