ווטסאפ - לינוקס, BSD, קוד פתוח ותוכנה חופשית בעברית. Whatsup - Linux, BSD, open source and free software in Hebrew

 
 
  כניסת חברים · רישום · שכחתי סיסמה  
tux the penguin
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
מתפתחאורח · ·
 

הודעה פורסם: 29/03/2015 - 18:35
נושא ההודעה: פייתון: איך להעביר קובץ בלי שידרוס אם כבר קיים קובץ בשם דומה

שלום
אני מנסה בפייתון להעביר קובץ ממקום למקום ואני מעוניין שאם קיים קובץ באותו שם אז שיתווסף לשמו של הקובץ מספר והוא יועבר בכל זאת.

זאת אומרת שאם אני רוצה להעביר קובץ בשם myfile מתקיית הבית לתיקיית הtmp וכבר קיים בתיקיית בtmp קובץ בשם זה, שיווצר קובץ myfile001 ואם גם הוא קיים אז שיווצר קובץ myfile002 וכו'

נ.ב. כרגע אני משתמש בסיפריית path בשביל כל הקשקשת של העתקות מחיקות וכו' במערכת הקבצים, אם יש איזושהי בעיה בצורת העבודה הזאת אשמח לשמוע.
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
mad__drאורח · ·
 

הודעה פורסם: 29/03/2015 - 21:40
נושא ההודעה: Re: פייתון: איך להעביר קובץ בלי שידרוס אם כבר קיים קובץ בשם

מתפתח :
שלום
אני מנסה בפייתון להעביר קובץ ממקום למקום ואני מעוניין שאם קיים קובץ באותו שם אז שיתווסף לשמו של הקובץ מספר והוא יועבר בכל זאת.

זאת אומרת שאם אני רוצה להעביר קובץ בשם myfile מתקיית הבית לתיקיית הtmp וכבר קיים בתיקיית בtmp קובץ בשם זה, שיווצר קובץ myfile001 ואם גם הוא קיים אז שיווצר קובץ myfile002 וכו'

נ.ב. כרגע אני משתמש בסיפריית path בשביל כל הקשקשת של העתקות מחיקות וכו' במערכת הקבצים, אם יש איזושהי בעיה בצורת העבודה הזאת אשמח לשמוע.


http://stackoverflow.com/questions/10978869/safely-create-a-file-if-and-only-if-it-does-not-exist-with-python

לך על הפתרון הראשון, תוסיף לולאה עם counter כדי לקדם את המספר בשם הקובץ
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
צפריראורח · ·
 

הודעה פורסם: 30/03/2015 - 23:20
נושא ההודעה:

האם מדובר על העברה של קובץ באותה תיקיה? או לתיקיה אחרת באותה מערכת קבצים? אם כן, חבל להתחיל להעתיק. כל מה שצריך הוא לנסות להעביר את הקובץ. מובטח שפעולת שינוי השם היא אטומית (כלומר: או תצליח או תכשל). כלומר, ב־C הייתי משתמש ב־rename עם הדגל RENAME_NOREPLACE וב־shell הייתי משתמש ב־mv -n.

מה המקבילה בפייתון? משהו קצת יותר נקי מאשר לוודא אי קיום ע"י פתיחה (ללא סגירה) ורק אז העברה?
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אורח · ·
 

הודעה פורסם: 31/03/2015 - 09:10
נושא ההודעה:

צריך לעשות את הבדיקה לפני:
קוד:

import os
if not os.path.exists(dst):
    os.rename(src,dst)
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
צפריראורח · ·
 

הודעה פורסם: 31/03/2015 - 11:41
נושא ההודעה:

יש כאן הנחה שהקובץ לא יווצר בין זמן הבדיקה לזמן ההעברה.
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
definexלא בפורום כעת ת.הצטרפות: 28/01/2006 · הודעות: 740 · מיקום: תל אביב
 

הודעה פורסם: 03/04/2015 - 13:35
נושא ההודעה:

כדי להמנע מבעיות זמן-בדיקה-לעומת-זמן-שימוש (TOCTOU) תנסה את הקוד הבא:

קוד:

f = os.open("/home/myfile", 'w', O_CREAT | O_EXCL)
os.rename('/home/myfile', '/tmp/myfile')
f.close()

אתה צריך לחזור על השורות האלו בלולאה עם counter מתאים בשם הקובץ. השורה הראשונה יוצרת קובץ אם הוא לא קיים (אחרת נכשלת) והשנייה תדרוס אותו עם הקובץ שאתה מזיז. יש כאן עדיין כמה בעיות:
1. בתיקייה ללא sticky ביט, כל משתמש עם הרשאות כתיבה לתיקייה יוכל להחליף בזמן בין השורות את הקובץ החדש שיצרת. למזלנו ל-/tmp יש sticky bit.
2. תהליך אחר של המשתמש שלך יכול בכל מקרה לשנות את השם של הקובץ החדש וליצור קובץ אחר במקום שידרס. כיוון ש-os.rename לא יושפע היעד הוא לינק (כי הוא יסיר אותו) אז לא אמורה להיות בעיה אמיתית.
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית ביקור באתר המפרסם  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
הצגת הודעות מלפני:     
מעבר אל:  
כל הזמנים הם GMT + 2 שעות
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
PNphpBB2 © 2003-2004 

תוכן הדיון

  1. אורח [מתפתח]
  2. אורח [mad__dr]
  3. אורח [צפריר]
  4. אורח
  5. אורח [צפריר]
  6. definex