c# | עזרה ב progressBar
-
שבוע טוב
כתבתי פעולת העתקה של file.copy ואני רוצה progressbar שיתקדם לפי קצב ההעתקה.
ראיתי בגוגל שדיברו על זה בהרבה מקומות אבל לא הצלחתי להבין איך עושים את זה.. תודה רבה -
@נ-נח התשובה הקצרה היא שאי אפשר.
למה? כי הפונקציהFile.Copy
לא נותנת לנו מידע על ההתקדמות.התשובה הארוכה היא שאם אתה ממש רוצה להציג התקדמות תצטרך להשתמש בפונקציה
CopyFileEx
, אבל זה פונקציה של C - לא של #C. כדי להשתמש בו תצטרך להשתמש באפשרות של #C לקרוא לפונקציות של C שנקרא Pinvoke.
זה נושא קצת מתקדם. -
לחילופין, ואחרי ההצעה המצויינת של @yossiz , מתוכן השאלות הכלליות שלך נראה שמה שאתה מנסה לעשות בסוף התהליך זה מנהל קבצים, ייתכן שקצת יותר מתוחכם מהרגיל ושלא יוכלו לעקוף וכו'
אם זה אכן כך, (והעניין הוא בעיקר התוצאה ולא רק הלימוד) מה שאני מציע, זה במקביל לחפש פרוייקט של מנהל קבצים בC# בגיט, וללמוד ממנו איך לעשות.
ואולי בכלל זו יכולה להיות נקודת התחלה יותר טובה מאשר לכתוב את הכל מאפס.
הנה דוגמא לפרוייקט בגיט שכתוב בC# שנראה מעניין (לא בדקתי אותו - רק על סמך מה שנראה)(זו רק הצעה. אם העניין שלך הוא ללמוד ובכלל לא התוצאה, אז אל תתייחס למה שכתבתי)
-
יש אפשרות שלישית, לבצע את ההעתקה בC# על ידי קריאה מקובץ המקור וכתיבה לקובץ היעד בזרם, והצגת ההתקדמות, ככה: https://stackoverflow.com/a/22858096/1271037
-
@dovid ראיתי את הפתרון הזה. משום מה זה מרגיש לי יותר נכון להשתמש ב-API מיועד לכך מאשר לממש בעצמך. אני תמיד מפחד ממצבים לא צפויים, וה-API המיועד יודע לטפל בהם ולפחות לזרוק שגיאות נכונות. חוץ מזה, בד"כ הוא ממוטב בצורה נכונה עבור העתקת קבצים. אני לא יודע אם אני צודק.
@נ-נח יש עוד פתרון, שזה להשתמש ב-API שנותן לך העתקת הקבצים של סייר ווינדוס עם הצגת התקדמות שלו.
פרטים כאן:
https://docs.microsoft.com/en-us/archive/msdn-magazine/2005/february/net-matters-file-copy-progress-custom-thread-pools#main:~:text=you can,c#: -
-
@upsilon01 לא הבנתי אותך, אתה מתכוון לכאורה להעברה של קובץ, בהעתקה, במערכת הקבצים NTFS, ככל הידוע לי תמיד מתבצעת קריאה וכתיבה.
-
@נ-נח ב VB יש את זה מוכן, אז גם ב C# אפשר להשתמש בזה
התחביר ב VB:My.Computer.FileSystem.CopyDirectory(X, Y, FileIO.UIOption.AllDialogs)
הכתובת המלאה של הפונקציה:
Microsoft.VisualBasic.MyServices.FileSystemProxy.CopyDirectory(String, String, UIOption, UICancelOption)
ותוכל לקרוא לפונקציה זו גם בC# על ידי רפרנס לDLL המתאים.
-
@yossiz הוא התכוון בהעברה.
(אתה חושב שאני ממליץ על הפתרון שאמרתי? אז תחשוב...). -
dovid