דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. שליפת סיומת קובץ - לפי שם הקובץ (C#)

שליפת סיומת קובץ - לפי שם הקובץ (C#)

מתוזמן נעוץ נעול הועבר תכנות
15 פוסטים 4 כותבים 422 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • OdedDvirO מנותק
    OdedDvirO מנותק
    OdedDvir
    השיב לmekev ב נערך לאחרונה על ידי OdedDvir
    #2

    @mekev שימוש בשמות אובייקטים בעברית הוא פרקטיקה גרועה מאוד, וגם מקשה על מתן התשובה. סליחה שאני עונה שלא לעניין, פשוט התרשמתי שאתה כבר לא מתכנת מתחיל...

    M תגובה 1 תגובה אחרונה
    5
    • M מנותק
      M מנותק
      mekev
      השיב לOdedDvir ב נערך לאחרונה על ידי
      #3

      @OdedDvir
      זה שההערה נכונה צודקת ובמקומה
      לא אומר שאני יודע אנגלית.....

      ככה התרגלתי
      וזה עובד.....

      ובכ"ז מקבל את ההערה הבונה
      ולהבא כמו שאני 'מתרגם' בשאלה את דוגמת הקוד אצלי למשהו גנרי
      אתרגם גם את האובייקטים

      תגובה 1 תגובה אחרונה
      2
      • חגיח מנותק
        חגיח מנותק
        חגי
        כתב ב נערך לאחרונה על ידי
        #4

        GetExtension מקבל נתיב כולל הסיומת לקובץ ומחזיר את הסיומת שלו.
        בעיקרון מה שתעשה זה Directory.EnumerateFiles כדי למצוא את הקובץ שלך.

        Directory.EnumerateFiles(Path.GetDirectoryName(הנתיב_ללא_הסיומת)).Where(f => f.StartsWith(הנתיב_ללא_הסיומת)).FirstOrDefault()
        

        במקרה ויש לך כמה קבצים עם אותו שם וסיומת שונה, הוא יחזיר את הראשון, במידה ואין בכלל קובץ כזה, הוא יחזיר null.

        dovidD M 2 תגובות תגובה אחרונה
        3
        • dovidD מנותק
          dovidD מנותק
          dovid ניהול
          השיב לחגי ב נערך לאחרונה על ידי dovid
          #5

          @חגי אני משפר את דיוק הקוד שלך למנוע התאמה של קובץ אחר ששמו מתחיל אותו דבר (רשומה 780 תתאים גם לרשומה 7805):

          string fileFromName(string fileWithoutExt)
          {
              var name = Path.GetFileName(fileWithoutExt);
              return Directory.EnumerateFiles(Path.GetDirectoryName(fileWithoutExt)).FirstOrDefault(f => Path.GetFileNameWithoutExtension(f) == name);
          }
          

          נ.ב. זה מהlinqpad 🙂
          4aa0150c-a120-40da-8149-0cff0a3d916e-image.png

          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

          בכל נושא אפשר ליצור קשר dovid@tchumim.com

          תגובה 1 תגובה אחרונה
          4
          • dovidD מנותק
            dovidD מנותק
            dovid ניהול
            השיב לmekev ב נערך לאחרונה על ידי dovid
            #6

            @mekev עוד הערות:

            • אין צורך לבדוק אם תיקיה קיימת. המתודה Directory.CreateDirectory בודקת את זה ובמקרה ויש היא פשוט לא עושה כלום.

            • Directory.GetCurrentDirectory() לא נחוץ. אתה יכול ישר לתת שם יחסי וההתחלה תהיה הCurrentDirectory, כלומר שני הקודים הבאים זהים:

            string originalPath = selectedFile.FileName;
            string path = Directory.GetCurrentDirectory();
            Directory.CreateDirectory(path + "\\contract");
            File.Copy(originalPath, path + "\\contract" + "\\" + idRow + fileExt, true);
            

            ובלי:

            string originalPath = selectedFile.FileName;
            Directory.CreateDirectory("contract");
            File.Copy(originalPath, "contract" + "\\" + idRow + fileExt, true);
            

            שים לב שבקוד השני הנתיב מתחיל ישירות מהמילה contract ללא פתיחה של "\". זה נקרא נתיב יחסי והוא מחושבן תמיד ביחס לCurrentDirectory.

            על הקטע של העברית אני לא חוזר, רק מחזק את ידיך לגמור עם זה כמה שיותר מהר.

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            תגובה 1 תגובה אחרונה
            7
            • M מנותק
              M מנותק
              mekev
              השיב לחגי ב נערך לאחרונה על ידי
              #7

              @חגי אמר בשליפת סיומת קובץ - לפי שם הקובץ (C#):

              במקרה ויש לך כמה קבצים עם אותו שם וסיומת שונה, הוא יחזיר את הראשון

              היות ואני מאפשר למשתמש להוסיף מספר סיומות
              בתוצאה הזאת הוא שולף ראשון את ה.JPG (לפני הPDF)

              בעוד אני מעוניין שהמשתמש יראה את הקובץ האחרון שנוצר
              (בהנחה שהמשתמש צירף בהתחלה טיוטה בסיומת JPG ואת הקובץ הסופי בPDF, הקובץ המקורי לא נדרס אלא התווסף קובץ נוסף
              ותמיד יוצג הטיוטה בסיומת .JPG)

              האם יש אפשרות לעשות מניפולציה באמצעות File.GetCreationTime להצגת הקובץ האחרון שנוצר?

              dovidD חגיח 2 תגובות תגובה אחרונה
              0
              • dovidD מנותק
                dovidD מנותק
                dovid ניהול
                השיב לmekev ב נערך לאחרונה על ידי dovid
                #8

                @mekev אתה שם לב כמה אתה מסתבך?
                מה הבעיה להוסיף שדה של שם קובץ בכל רשומה, עם הסיומת והכל?

                עריכה למקרה שתתעקש:

                string fileFromName(string fileWithoutExt)
                {
                    var name = Path.GetFileName(fileWithoutExt);
                    return new DirectoryInfo(Path.GetDirectoryName(fileWithoutExt))
                                   .EnumerateFiles()
                                   .OrderByDescending(f => f.CreationTime)
                                   .FirstOrDefault(f => Path.GetFileNameWithoutExtension(f.Name) == name)?.FullName;
                }
                

                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                M תגובה 1 תגובה אחרונה
                5
                • חגיח מנותק
                  חגיח מנותק
                  חגי
                  השיב לmekev ב נערך לאחרונה על ידי
                  #9
                  פוסט זה נמחק!
                  תגובה 1 תגובה אחרונה
                  0
                  • M מנותק
                    M מנותק
                    mekev
                    השיב לdovid ב נערך לאחרונה על ידי
                    #10

                    @dovid אמר בשליפת סיומת קובץ - לפי שם הקובץ (C#):

                    מה הבעיה להוסיף שדה של שם קובץ בכל רשומה, עם הסיומת והכל?

                    במידה וניתן להשיג את התוצאה הרצויה בריצה פשוטה של הקוד
                    מדוע לשמור סתם נתון בבסיס הנתונים

                    אני הרי לא שומר את הקובץ עצמו במסד
                    אלא רק נתון סטטי מקומי המפנה לשם/מיקום הקובץ

                    OdedDvirO תגובה 1 תגובה אחרונה
                    0
                    • OdedDvirO מנותק
                      OdedDvirO מנותק
                      OdedDvir
                      השיב לmekev ב נערך לאחרונה על ידי
                      #11

                      @mekev הואיל ודוד לא ענה, אני מרשה לעצמי לדחוף את האף:

                      במידה וניתן להשיג את התוצאה הרצויה בריצה פשוטה של הקוד
                      מדוע לשמור סתם נתון בבסיס הנתונים

                      זה פשוט ענין של גישה יותר בריאה.
                      באופן כללי, תמיד עדיף לשמור נתון סטטי מאשר לחשבן אותו בכל פעם מחדש, מכמה סיבות:

                      1. הרי תמיד תקבל את אותה התוצאה, מה הטעם לחשבן את זה שוב ושוב?
                      2. מקום אחסון תמיד יותר זול מכח חישוב, אתה מנסה לחסוך כמה תוים בודדים בזיכרון, אבל מקריב בשביל כך הרבה משאבים במעבד ובדיסק, ההפסד שלך מרובה מהרווח שלך.
                      3. והכי חשוב: הקוד שלך יהיה יותר פשוט, ויותר מובן, וממילא תחסוך לך זמן יקר בתחזוקה שלו בעתיד.
                      dovidD תגובה 1 תגובה אחרונה
                      3
                      • dovidD מנותק
                        dovidD מנותק
                        dovid ניהול
                        השיב לOdedDvir ב נערך לאחרונה על ידי dovid
                        #12

                        @OdedDvir לא מסכים איתך שזה כלל שאחסון עדיף מחשבון, הייתי מבכר חשבון ברמה זו כשהוא לא מתנגש עם סיבה 3 - סיבוך בקוד או בהנתהגות.
                        @mekev יש הבדל בין לדעת לבין להסיק. אם לכל רשומה היה קובץ כשמה, זה היה בסדר. הבעיה שישנה סיומת. הסיומת עצמה אפשר למצוא אותה, אבל זה "היסק" זהיר שמביא הנחות סמויות וקוד רגיש יחסית שנוסף על כל הקוד שעליך לתחזק ולהבין. לפחות שמור את הסיומת.
                        תחשוב בריא, נניח תרצה לאפשר שני קבצים בעתיד, בגישה כעת תצטרך לערוך שינויים מקיפים בשביל כך. או תחשוב שתוכנת שחזור/גיבוי גורם אחר יעתיק את הקבצים מחדש, התאריך האחרון כבר לא יהיה באמת תאריך אחרון. קוראים לזה הנחות מסוכנות, וצריך תמיד לזהות אותם. מה שלא שחור לבן, לברוח.

                        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                        בכל נושא אפשר ליצור קשר dovid@tchumim.com

                        OdedDvirO M 2 תגובות תגובה אחרונה
                        4
                        • OdedDvirO מנותק
                          OdedDvirO מנותק
                          OdedDvir
                          השיב לdovid ב נערך לאחרונה על ידי
                          #13

                          @dovid אתה צודק, הניסוח שלי היה קצת מוקצן. מקום אחסון לרוב יותר זול מכח חישוב, לא התכוונתי להצהיר שבהכרח נעדיף אותו תמיד על חישוב. פשוט במקרה הזה, זה הציק לי שיש כאן הסתבכות מיותרת שניתנת לפיתרון פשוט, בלי תוספת עלות.

                          תגובה 1 תגובה אחרונה
                          1
                          • M מנותק
                            M מנותק
                            mekev
                            השיב לdovid ב נערך לאחרונה על ידי
                            #14

                            @dovid אמר בשליפת סיומת קובץ - לפי שם הקובץ (C#):

                            יש הבדל בין לדעת לבין להסיק

                            כלל גדול
                            החכמתי.

                            לגבי הנקודה האם להעדיף מקום אחסון על פני כח חישוב
                            יצאתי מתוך הנחה (ללא מקור) שהיות שגם במקום אחסון אני צריך פעולת חישוב לשליפה>הרצת הקובץ

                            (שגם מצריכה חישוב, היות והקובץ אצלי נשמר בתיקיית התוכנה, ויש מספר משתמשים שמחוברים דרך תיקיית רשת כאשר האות כונן לחלקם שונה, אז אוכל לשמור רק את שם הקובץ והסיומת ללא הנתיב המלא )

                            אז למה לא לעשות ישירות רק את פעולת החישוב?

                            וע"ז תשובת @dovid סדרה לי את הראש

                            M תגובה 1 תגובה אחרונה
                            1
                            • M מנותק
                              M מנותק
                              mekev
                              השיב לmekev ב נערך לאחרונה על ידי
                              #15

                              @mekev

                              בדקתי כעת בתוכנת 'חשבשבת'
                              ואכן בצירוף קובץ - נשמר שם הקובץ + הסיומת (ללא הנתיב, אלא הפניה יחסית)

                              f2ab78ce-1543-4d34-b9b2-753a3c118021-image.png

                              b8bba4cc-7310-4a08-8a86-d385d73eb0e3-image.png

                              תגובה 1 תגובה אחרונה
                              0
                              • dovidD dovid העביר נושא זה מ-תכנות ב-

                              בא תתחבר לדף היומי!
                              • התחברות

                              • אין לך חשבון עדיין? הרשמה

                              • התחברו או הירשמו כדי לחפש.
                              • פוסט ראשון
                                פוסט אחרון
                              0
                              • דף הבית
                              • קטגוריות
                              • פוסטים אחרונים
                              • משתמשים
                              • חיפוש
                              • חוקי הפורום