user1100401
user1100401

Reputation: 3

Auto Incrementing file names?

I have a list of files like so

abc.txt
pas.txt
tempr.txt

What I would like to do is to append english alphabets to theese file names .. the result should look like this

abc_a.txt
pas_b.txt
tempr_c.txt

This process should continue till the last character (i.e 'z'). if there are more files then the file names would become

abc_a.txt
pas_b.txt
tempr_c.txt
.................
filename_z.txt
anotherfilename_a001.txt

Notice that the counter was again reset to the first character except an integer was attached to it.

This is the code that i have right now. Please note that it is NOT working ..

string alphabets= "abcdefghijklmnopqrstuvwxyz";
List<string> filenames = new List<string>();
filenames.Add("test1.txt");
filenames.Add("newfile.cs");
filenames.Add("test2.txt");
filenames.Add("newfile2.cs");


string currentFileNmae = string.Empty;

foreach(string s in filenames) {
    char usedAlphabet = new char();
    for(int i = 0;i<=alphabets.Length-1;i+=11) {
        usedAlphabet.Dump();
        alphabets[i].Dump();
        if(usedAlphabet != alphabets[i] )
        {
            if(currentFileNmae!= s)  
            {
                string.Format("{0}--{1}",s,alphabets[i]).Dump();
                usedAlphabet = alphabets[i];
                currentFileNmae = s;
            }

        }


        break;

    }

}

I am part of a team that's building a file renamer tool for our internal purposes and hence i need this code. This is part of the our enumertation functionality that we have planned.

Please suggest. thanks

Upvotes: 0

Views: 1511

Answers (3)

CSharpie
CSharpie

Reputation: 9467

Had no coffee yet, but this should do.

List<string> files = new List<string>();


        int charIndex = 0;
        int numericIndex = -1;

        foreach (var file in files.Select(path => new FileInfo(path)))
        {
            // Create new Filename - This may needs some tuning 
            // to really remove only the extension ad the end
            // It doesnt take care of things like
            // file.bmp.bmp.bmp ...
            string newFileName =  String.Format("{0}_{1}{2}.{3}", 
                file.FullName.Replace(file.Extension,String.Empty),
                (char)(charIndex++ + 97), 
                (numericIndex > -1 ? String.Format("{0:D4}", numericIndex) : String.Empty), 
                file.Extension);

            // Rename the File
            file.MoveTo(newFileName);

            // Increment Counters.
            if (charIndex > 25)
            {
                charIndex = 0;
                numericIndex++;
            }
        }

Upvotes: 0

ismellike
ismellike

Reputation: 629

You can try something like this

const string directory = @"C:\\wherever";
string[] fiNames = new string[]{ "abc", "pas", "etc",};
char[] alphabet =       "abcdefghijklmnopqrstuvwxyz".ToCharArray();
int x = 0;
 string ending = "";
for(int i = fiNames.Count()-1; i>=0; i--)
{
  if(x%26==0)
   {
      x=0 
       if( ending=="")
          ending="1";
       else
          ending=(System.Convert.ToInt32(ending)+1).ToString();
    }
  System.IO.File.Move(directory+fiNames[i], fiNames[i]+alphabet[x].ToString()+ending); 
x++;
}

Upvotes: 0

HABO
HABO

Reputation: 15816

Try starting here:

using System.Diagnostics;
using System.IO;

string filename = @"C:\Foo\Bar.txt";

for (int count = 0; count < 100; count++)
{
    char letter = (char)((int)'a' + count % 26);
    string numeric = (count / 26) == 0 ? "" : (count / 26).ToString("000");
    Debug.Print(Path.GetFileNameWithoutExtension(filename) + "_" + letter + numeric + Path.GetExtension(filename));
}

Substitute your own loop to go through the filenames and use Path to manipulate the pieces/parts of the names.

The renaming, IIRC, can be handled by File.Move. Surround it with a try/catch to implement the name collision logic.

Upvotes: 1

Related Questions