בדיקה אם קובץ כבר פועל. c# - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

בדיקה אם קובץ כבר פועל. c#


eido300

Recommended Posts

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

קישור לתוכן
שתף באתרים אחרים

אני חושב שtry/catch לא כל כך יעילים לי כאן כיוון ש:

1. אני צריך שהוא יבדוק את זה לפני ניסיון המחיקה ולא שיגיד לי את זה בדיעבד אחרי הניסיון.

2. כמו שהבנתי התוכנה לא תמשיך מהנקודה שהיא עצרה אלא מאחרי הבלוק.

אני אפרט, לדוגמא: נניח שהcatch מדפיס הודעה עם השגיאה, אם אני מפעיל משפט foreach שעובר על כל הקבצים בתיקייה, ובקובץ השני התגלתה השגיאה, התוכנה תחזור לפעול אחרי המשפט foreach, ולא תחכה עד שאני אסגור את הקובץ ואז היא תמחוק את הקובץ, לכן אני מחפש משפט if שיבדוק שהקובץ סגור ורק אז במידה והוא סגור יפעיל את פקודת המחיקה, ואם הקובץ לא סגור שיודיע שהוא לא סגור ואז יבדוק שוב, ככה עד שהוא ימצא שהקובץ סגור ורק אז הוא ימחק אותו (בקיצור אותה צורה שהמערכת הפעלה מודיעה לך שאתה לא יכול למחוק קובץ כי הוא בשימוש), לכן try/catch לא כל כך טובים לי כאן.

קישור לתוכן
שתף באתרים אחרים

מחיפוש זריז לא נראה שמישהו מצא פתרון יותר טוב מ-try/catch:

http://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-use

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

לגבי נקודה 2: אתה יכול לשים את ה-try/catch בתוך ה-foreach.

קישור לתוכן
שתף באתרים אחרים

האמת שגם אני ראיתי את זה, פשוט היה קשה לי להאמין שבשפת low level יש פיתרון ואילו בשפת עלית אין פיתרון מובנה, כנראה שטעיתי...

בסופו של דבר זה הקוד שהוספתי (שורות 3 ו7-29).

זה בסדר?

ולמה בכל התשובות מתעקשים להשתמש בstream?

תודה רבה.

עריכה: עכשיו זה עושה בעיות, אני אנסה שוב...

קישור לתוכן
שתף באתרים אחרים

אין שום פיתרון בלי try/catch - וזה בכוונה. בעולם מרובה תהליכים/נימים, זה שאתה יודע עכשיו אם הקובץ בשימוש לא יעזור לך בעתיד כשתנסה לגשת אליו - עד אז יכול להיות שתהליך אחר ינעל אותו. אפילו אם זאת השורה הבאה בקוד שלך. אפילו אם זה מחשב עם מעבד אחד. אפילו אם אתה נשבע לתוכנה שלך בכל היקר לך שאף אחד לא ינסה במילי שנייה הקרובה.

קישור לתוכן
שתף באתרים אחרים

זה בדיוק מה ש-ytoledano אמר - הדרך היחידה לוודא שהקובץ לא בשימוש היא לנסות להשתמש בו. הדרך "להשתמש" בקובץ היא לפתוח אותו לקריאה\כתיבה, וזה מה ש-FileStream עושה.

אגב, גם אם אתה משתמש ב-FileStream על מנת לזהות שהקובץ לא בשימוש, זה לא מבטיח שהוא לא יהיה בשימוש כשתבוא למחוק אותו - יכול להיות שבדיוק בין הבדיקה הזו למחיקה עצמה תוכנה אחרת החליטה לפתוח את הקובץ, ולא תוכל למחוק אותו. לכן בכל מקרה גם במחיקה צריך try/catch.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...