Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

TrimString

Îåêßíçóå áðü ôï ìÝëïò Τάσκος Γιώργος. Τελευταία δημοσίευση από το μέλος Τάσκος Γιώργος στις 20-09-2008, 03:05. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  19-09-2008, 11:09 44761

    TrimString

    Μήπως μπορεί να βοηθήσει κάποιος με ένα θέμα?

    Σε ένα έλεγχο που κάνω στα αρχεία κάποιου directory, θα ήθελα
    να κόβω κάποιο συγκεκριμένο κομμάτι του αρχείου.

    π.χ. το "arxeio1.aaa" να γίνει "eio1.aaa"

    Κατάφερα να το κάνω Rename + αύξοντα αριθμό..αλλά δεν εξυπηρετεί τον σκοπό.

  •  19-09-2008, 11:41 44762 σε απάντηση της 44761

    Απ: TrimString

    για να το καταλάβω θέλεις την επέκταση του αρχείου και 3 τελευταία γράμματα απο το αρχείο; αυξάνοντας κατα 1 καθώς διαβάζεις τα αρχεία;

  •  19-09-2008, 14:09 44767 σε απάντηση της 44762

    Απ: TrimString

    Όχι, θέλω το "fileName.xxx" να γίνει "Name.xxx", δηλώνοντας είτε Substring length των χαρακτήρων που θέλω να κόψω,
    από την θέση 0, ή ένα string π.χ. str = "file", καί όποιο αρχείο ξεκινάει με το συγκεκριμένο substring, να το μετονομάζει
    αφαιρόντας το str από το fileName.xxx.

  •  19-09-2008, 15:00 44768 σε απάντηση της 44761

    Απ: TrimString

    Χρησιμοιποήσε την substring........Smile και θα με θυμηθεις....Wink

    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
  •  19-09-2008, 15:21 44770 σε απάντηση της 44767

    Απ: TrimString

    χρησιμοποίησε το substring , όπως λεει ο Bill, για να πάρεις τους τελευταίους 4 χαρακτήρες.

    varstring.substring(varstring.length-4,4)

    έτσι παίρνεις τους 4 τελευταίους χαρακτήρες.
  •  19-09-2008, 15:30 44771 σε απάντηση της 44767

    Απ: TrimString

    Replace("fileName.xxx", "file","", 1, 1)
    Manos
  •  19-09-2008, 16:16 44773 σε απάντηση της 44771

    Απ: TrimString

    Ευχαριστώ όλους,

    έπαιξε με τον παρακάτω κώδικα, σύμφωνα με τις ανάγκες μου βέβαια.

    Με την File.Replace(string, string, string) δεν έβγαλα άκρη, μου πετούσε κάποιο exception περί Path,
    κι έτσι το έκανα μπακαλίστικο(σχετικά, true) :P

            public void TrimFiles(string dirPath, string trimChars)
            {
                string fileName;
                string sourceFile;
                string destFile;
                int trimLength;
                int dirLength;

                trimLength = trimChars.Length;
                dirLength = dirPath.Length;

                foreach (string sFile in Directory.GetFiles(dirPath))
                {
                    fileName = sFile.Substring(dirLength + trimLength).Trim();
                    destFile = Path.Combine(dirPath, fileName);
                    sourceFile = Path.Combine(dirPath, sFile);
                    File.Copy(sourceFile, destFile, true);
                    File.Delete(sFile);
                }           
            }

  •  19-09-2008, 22:04 44782 σε απάντηση της 44773

    Απ: TrimString

    Είναι λογικό να μην βγάλεις άκρη με την 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
  •  20-09-2008, 03:05 44792 σε απάντηση της 44782

    Απ: TrimString

    Ευχαριστώ για τις παρατηρήσεις παναγιώτη και για την υπόδειξη ενός ποιο καθαρού κώδικα.
    Θέλω να λάβεις υπ'όψην ότι είμαι αρχάριος, κι έχω κάνει ενα πρόγραμμα εώς τώρα. Πάντως οι πληροφορίες σου
    είναι πολυτιμές για να λαμβάνω υπ'όψην και την ομαδική συνεργασία αλλά και την εύκολη ανάγνωση κωδικα μου απο τρίτους.

    Υ.Γ. Θα ξεπεραστούν και τα κατάλοιπα της Pascal και Basic.


Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems