Είναι λογικό να μην βγάλεις άκρη με την File.Replace, γιατί αυτό που κάνει δεν είναι σε καμμία περίπτωση rename. Αντιγράφει ένα αρχείο πάνω από ένα άλλο και κρατάει backup του αρχικού. Ρίξε αν θέλεις μία ματιά στο documentation της File.Replace αλλά και της ίδιας της File για να δεις τί δυνατότητες έχουν. Απλά πάς επάνω στο File.Replace και πατάς F1. Δες και τις υπόλοιπες μεθόδους της File για να δεις τί μπορείς να κάνεις με αυτή.
Γενικά, είναι πολύ κακή συνήθεια να τα παρατάς με το πρώτο πρόβλημα και να γυρίζεις σε μπακάλικες μεθόδους. Έτσι ούτε τη δουλειά σου δεν κάνεις σωστά ούτε μαθαίνεις το σωστό τρόπο. Αν μάλιστα δουλεύεις σε εταιρεία και οι "μπακάλικες" μέθοδοι επηρεάζουν άλλους, θα διαπιστώσεις ότι η συμπεριφορά τους μπορεί να αρχίσει να αλλάζει ... με περίεργο τρόπο ....
Αυτό που ήθελες θα μπορούσες να το πετύχεις με τον παρακάτω κώδικα, ο οποίος βασικά χρησιμοποιεί την FileInfo.MoveTo . Θα μπορούσα να χρησιμοποιήσω και την File.Move, αλλά δεν ήθελα να ασχολούμαι με strings και parsing:
private static void TrimFileNames(string dirPath, int trimChars)
{
DirectoryInfo dir = new DirectoryInfo(dirPath);
foreach (FileInfo file in dir.GetFiles())
{
string destFileName = file.Name.Substring(trimChars);
string destFilePath = Path.Combine(dirPath, destFileName);
file.MoveTo(destFilePath);
}
}
Θα μπορούσα πάλι να εκμεταλλευτώ τη δυνατότητα της GetFiles να πάρει ένα search pattern και να γράψω την παρακάτω συνάρτηση, η οποία αναζητά μόνο αρχεία με το συγκεκριμένο πρόθεμα:
private static void TrimFileNames(string dirPath, string trimPrefix)
{
DirectoryInfo dir = new DirectoryInfo(dirPath);
int trimChars = trimPrefix.Length;
foreach (FileInfo file in dir.GetFiles(trimPrefix + "*.*"))
{
string destFileName = file.Name.Substring(trimChars);
string destFilePath = Path.Combine(dirPath, destFileName);
file.MoveTo(destFilePath);
}
}
Μερικές παρατηρήσεις επιπλέον για τον κώδικα σου:
- Από τη στιγμή που καλείς την Substring η χρήση της Trim είναι περιττή, εκτός και αν πραγματικά θέλεις να αφαιρέσεις τυχόν κενούς χαρακτήρες που υπήρχαν στο αρχικό όνομα. Διαφορετικά κάνεις άλλο ένα string operation χωρίς λόγο
- Είναι κακή πρακτική να βάζεις τους ορισμούς των μεταβλητών στην αρχή μίας συνάρτησης. Αυτό μπορεί να ήταν σωστό πριν από 10-20 χρόνια, στην Pascal και την Basic όπου οι μεταβλητές είχαν ισχύ σε όλη τη συνάρτηση. Σε όλες τις άλλες γλώσσες όμως το σωστό είναι να ορίζεις τις μεταβλητές όσο πιο κοντά γίνεται στο σημείο όπου θα χρησιμοποιηθούν. Ορίζοντας τις destFileName, destFilePath μέσα στο loop εξασφαλίζω ότι δεν υπάρχει κίνδυνος να χρησιμοποιηθούν τιμές από προηγούμενο iteration και ότι τα stings που χρησιμοποιώ θα μαρκαριστούν για garbage collection μόλις πάψω να τα χρησιμοποιώ. Επίσης αποφεύγω την περίπτωση να διαρρεύσει μία τιμή έξω από το loop.
- Τα μπακαλίστικα συσσωρεύονται πολύ πιο γρήγορα απ' ότι νομίζεις και σύντομα ο κώδικας σου γίνεται σαν αποθήκη μπακάλικου. Φροντίζοντας ο κώδικας σου να είναι καθαρός και σωστός εξασφαλίζεις και τη δική σου ψυχική υγεία και αποφεύγεις τις κατάρες των νυν και μελλοντικών συναδέλφων οι οποίοι θα αναγκαστούν να συντηρήσουν τον κώδικα σου.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos