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

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

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

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

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

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

    M מנותק
    M מנותק
    mekev
    כתב ב נערך לאחרונה על ידי
    #3

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

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

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

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

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

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

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

      dovidD M 2 תגובות תגובה אחרונה
      3
      • חגיח חגי

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

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

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

        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
        • M mekev

          כיצד אני מאתר סיומת קובץ מקומי במחשב
          או בניסוח אחר - כיצד אני פותח קובץ מקומי במחשב - שאני יודע את שם הקובץ, ללא הסיומת

          מה אני מנסה לעשות?
          יש לי טבלה שאני מאפשר לצרף לכל שורה, מסמך בודד מאחד מסוגי סיומות הקבצים

          דוגמא:

           OpenFileDialog הוספתחוזה = new OpenFileDialog();
          הוספתחוזה.Filter = "contract Files|*.pdf;*.jpg;*.jpeg";
          
          string סיומתקובץ = Path.GetExtension(הוספתחוזה.FileName);
          
          string נתיביבואהוספתחוזה = הוספתחוזה.FileName;
           string path = Directory.GetCurrentDirectory();
          if (!Directory.Exists(path + "\\contract"))
          Directory.CreateDirectory(path + "\\contract");
           File.Copy(נתיביבואהוספתחוזה, path + "\\contract" + "\\" + מזההרשומה + סיומתקובץ, true);
          

          ואני מעוניין באפשרות לפתוח בצורה ישירה את הקובץ
          הדרך שאני מכיר זה:

          System.Diagnostics.Process.Start(path + "\\contract" + "\\" + מזההרשומה + ".pdf");
          

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

          ניסתי להשתמש במתודה Path.GetExtension
          ללא הצלחה

          אשמח לעזרתכם

          dovidD מנותק
          dovidD מנותק
          dovid
          ניהול
          כתב ב נערך לאחרונה על ידי 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
          • חגיח חגי

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

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

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

            M מנותק
            M מנותק
            mekev
            כתב ב נערך לאחרונה על ידי
            #7

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

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

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

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

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

            dovidD חגיח 2 תגובות תגובה אחרונה
            0
            • M mekev

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

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

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

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

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

              dovidD מנותק
              dovidD מנותק
              dovid
              ניהול
              כתב ב נערך לאחרונה על ידי 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
              • M mekev

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

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

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

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

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

                חגיח מנותק
                חגיח מנותק
                חגי
                כתב ב נערך לאחרונה על ידי
                #9
                פוסט זה נמחק!
                תגובה 1 תגובה אחרונה
                0
                • dovidD dovid

                  @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;
                  }
                  
                  M מנותק
                  M מנותק
                  mekev
                  כתב ב נערך לאחרונה על ידי
                  #10

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

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

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

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

                  OdedDvirO תגובה 1 תגובה אחרונה
                  0
                  • M mekev

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

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

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

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

                    OdedDvirO מנותק
                    OdedDvirO מנותק
                    OdedDvir
                    כתב ב נערך לאחרונה על ידי
                    #11

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

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

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

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

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

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

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

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

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

                      • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                      • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                      OdedDvirO M 2 תגובות תגובה אחרונה
                      4
                      • dovidD dovid

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

                        OdedDvirO מנותק
                        OdedDvirO מנותק
                        OdedDvir
                        כתב ב נערך לאחרונה על ידי
                        #13

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

                        תגובה 1 תגובה אחרונה
                        1
                        • dovidD dovid

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

                          M מנותק
                          M מנותק
                          mekev
                          כתב ב נערך לאחרונה על ידי
                          #14

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

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

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

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

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

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

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

                          M תגובה 1 תגובה אחרונה
                          1
                          • M mekev

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

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

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

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

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

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

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

                            M מנותק
                            M מנותק
                            mekev
                            כתב ב נערך לאחרונה על ידי
                            #15

                            @mekev

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

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

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

                            תגובה 1 תגובה אחרונה
                            0
                            • dovidD dovid העביר נושא זה מ-תכנות ב-
                            תגובה
                            • תגובה כנושא
                            התחברו כדי לפרסם תגובה
                            • מהישן לחדש
                            • מהחדש לישן
                            • הכי הרבה הצבעות


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

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

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