ประโยชน์ของการเขียนไปยังตำแหน่งชั่วคราวคืออะไรแล้วคัดลอกไปยังปลายทางที่ต้องการ


47

ฉันกำลังเขียนแอปพลิเคชันที่ทำงานกับภาพถ่ายดาวเทียมและเจ้านายของฉันขอให้ฉันดูแอปพลิเคชั่นเชิงพาณิชย์บางส่วนและดูว่ามันทำงานอย่างไร ฉันพบพฤติกรรมแปลก ๆ และเมื่อฉันมองฉันก็พบว่ามันอยู่ในแอปพลิเคชันมาตรฐานอื่น ๆ เช่นกัน

โปรแกรมเหล่านี้ก่อนเขียนไปยังโฟลเดอร์ temp แล้วคัดลอกไปยังปลายทางที่ต้องการ

ตัวอย่าง: 7zip แรกแยกไปยังโฟลเดอร์ temp แล้วคัดลอกข้อมูลที่แยกแล้วไปยังตำแหน่งที่คุณได้ขอให้แยกข้อมูลไป

ฉันเห็นปัญหาหลายประการด้วยวิธีนี้:

  1. โฟลเดอร์ temp อาจมีพื้นที่ไม่เพียงพอในขณะที่ตำแหน่งที่ตั้งใจไว้อาจมีพื้นที่ว่างจำนวนมาก

  2. หากเป็นไฟล์ขนาดใหญ่อาจต้องใช้เวลาในการดำเนินการคัดลอก

ฉันคิดเกี่ยวกับมันมาก แต่ฉันไม่เห็นจุดบวกเดียวที่จะทำสิ่งนี้ ฉันทำบางสิ่งหายไปหรือมีประโยชน์อย่างแท้จริงในการทำสิ่งนี้หรือไม่?


หากแอปพลิเคชันต้องการให้ทำ มิฉะนั้นทำในสิ่งที่สมเหตุสมผล สมองของคุณกำลังบอกคุณว่ามันไม่จำเป็นในกรณีนี้ ฉันอยู่ในค่ายของการทำงานให้น้อยที่สุดเท่าที่จะเป็นไปได้ตามที่คุณสามารถบอกได้ด้วยคำตอบของฉันดังนั้นฉันขอแนะนำให้ทำอย่างน้อยที่สุดเท่าที่เป็นไปได้สำหรับแอพ
Jason Sebring

1
คุณแน่ใจหรือว่าเป็น "การคัดลอก" ไฟล์และไม่ใช่ "ย้าย" หรือไม่ แตกต่างใหญ่
frankc

จากblogs.rsa.com/...สำหรับมัลแวร์, ข้อดีคือ1) รับประกันหลีกเลี่ยง writability ข้อผิดพลาด "สีแดง" การตรวจสอบก่อนที่คุณจะได้ดาวน์โหลดอย่างเต็มที่แม้กระทั่งไวรัสบนคอมพิวเตอร์ของผู้ใช้2)ดิสก์ TEMP มักจะได้เร็วขึ้น (RAMDisk) ลดเวลาสำหรับ การตรวจจับในขณะที่ไวรัสยังอยู่ในขั้นตอนการดาวน์โหลด (เมื่อไวรัสเกิดขึ้นอย่างเต็มที่และมีการจัดการเพื่อดำเนินการเป็นเวลา 0.05 วินาทีเกมจะจบลงดังนั้นจึงเป็นการแข่งขันของเวลา)
Pacerier

3)ในขณะที่คุณยังคงดาวน์โหลดหรือทำงานอยู่หากมีไวรัสที่ทำให้คุณ (โดยไม่รู้ตัวบางครั้ง) และปล่อยให้กระดูกอยู่โดยรอบคุณยังสามารถไว้วางใจได้ว่า x% โอกาสที่ระบบปฏิบัติการหรือผู้ใช้จะช่วยลบโดยไม่ได้ตั้งใจ กระดูกตายของคุณในขณะที่พวกเขากำลังล้างข้อมูลจำนวนมากจากโฟลเดอร์ TEMP สิ่งนี้จะช่วยลดความน่าจะเป็นในการตรวจจับ
Pacerier

คำตอบ:


95

เหตุผลเล็ก ๆ น้อย ๆ ที่ฉันนึกได้:

  • บนแพลตฟอร์มส่วนใหญ่การย้ายไฟล์เป็นแบบปรมาณู แต่การเขียนไฟล์ไม่ได้ (โดยเฉพาะถ้าคุณไม่สามารถเขียนข้อมูลทั้งหมดในครั้งเดียว) ดังนั้นหากคุณมีรูปแบบผู้ผลิต / ผู้บริโภคทั่วไป (หนึ่งกระบวนการสร้างไฟล์อื่น ๆ จะเฝ้าดูไดเรกทอรีและหยิบทุกอย่างที่พบ) เขียนไปยังโฟลเดอร์ temp ก่อนแล้วย้ายไปยังตำแหน่งจริงหมายความว่าผู้บริโภคจะไม่เห็น ไฟล์ที่ยังไม่เสร็จ
  • หากกระบวนการที่เขียนไฟล์นั้นตายไปครึ่งทางคุณจะพบไฟล์ที่เสียหายบนดิสก์ของคุณ หากอยู่ในสถานที่จริงคุณต้องดูแลทำความสะอาดด้วยตัวเอง แต่ถ้าอยู่ในสถานที่ที่มีอุณหภูมิระบบปฏิบัติการจะดูแลมัน
  • หากเกิดไฟล์ที่จะสร้างขึ้นในขณะที่งานสำรองกำลังทำงานอยู่งานอาจรับไฟล์ที่ไม่สมบูรณ์ โดยทั่วไปไดเรกทอรีชั่วคราวจะไม่รวมอยู่ในข้อมูลสำรองดังนั้นไฟล์จะถูกรวมเมื่อถูกย้ายไปยังปลายทางสุดท้ายเท่านั้น
  • ไดเรกทอรี temp อาจอยู่ในระบบไฟล์ที่รวดเร็ว แต่ระเหยได้ (เช่น ramdisk) ซึ่งอาจเป็นประโยชน์สำหรับสิ่งต่าง ๆ เช่นการดาวน์โหลดไฟล์จำนวนมากของไฟล์เดียวกันแบบขนานหรือทำการประมวลผลแบบแทนที่บนไฟล์ที่มีการค้นหาจำนวนมาก นอกจากนี้ไดเร็กทอรีชั่วคราวมีแนวโน้มที่จะทำให้เกิดการแตกแฟรกเมนต์มากกว่าไดเรกทอรีที่มีการอ่านเขียนและลบบ่อยครั้งและการเก็บไดเรกทอรีชั่วคราวไว้ในพาร์ติชันแยกต่างหากสามารถช่วยให้การแยกส่วนของพาร์ติชันอื่น ๆ

TL; DR - ส่วนใหญ่มันจะลดลงไปเป็น atomicity นั่นก็คือคุณต้องการทำให้มัน (ที่ตำแหน่งสุดท้าย) ไฟล์นั้นสมบูรณ์หรือไม่มีเลยในเวลาใดก็ตาม


12
หากไดเรกทอรีชั่วคราวอยู่ในพาร์ติชันแยกต่างหากคุณจะสูญเสียอะตอมมิกซิตี้
yfeldblum

16
บางโปรแกรมจะแยก / คัดลอกไปยังไดเรกทอรีที่ต้องการ แต่จะใช้นามสกุลไฟล์ชั่วคราว (เช่น. tmp) และเปลี่ยนชื่อเมื่อเสร็จสมบูรณ์
Dan Diplo

5
บางครั้งการเขียนไปยังไฟล์ temp ก็มีประโยชน์เช่นกันเมื่อโปรแกรมของคุณพยายามอัปโหลดไฟล์เดียวกันในเวลาเดียวกันและคุณไม่สามารถพึ่งพาระบบไฟล์เพื่อให้ระดับการล็อคที่ถูกต้อง . การใช้ไฟล์ temp จะทำให้แน่ใจว่าไฟล์ผลลัพธ์จะไม่จบลงด้วยการผสมผสานข้อมูลจากการอัพโหลดทั้งสองแบบ แน่นอนว่านี่เป็นอีกตัวอย่างหนึ่งของความเป็นปรมาณู
Krzysztof Kozielczyk

1
กรณีของ Dan Diplo มีประโยชน์เมื่ออัปเดตไฟล์ที่มีอยู่ คุณไม่ต้องการแทนที่อันเก่าจนกว่าจะมีการเขียนอันใหม่สำเร็จเพื่อมิให้การเขียนอันใหม่ล้มเหลวหรืออย่างอื่นอ่านอันใหม่ก่อนที่จะเขียนเสร็จสมบูรณ์
RalphChapin

1
น่าเสียดายที่โฟลเดอร์ OS Temp นั้นเต็มไปด้วยไฟล์และโฟลเดอร์เก่า ๆ เพราะระบบปฏิบัติการไม่ได้ทำความสะอาด! ดังนั้นเราในฐานะนักพัฒนายังควรทำความสะอาดมัน! superuser.com/questions/296824/…
markmnl

15

ดูเหมือนว่าจะเป็นปัญหาใน Windows ซึ่งเกี่ยวข้องกับการจัดการการลากวางโดยเฉพาะ

นักพัฒนาของไคลเอนต์WINSCPได้พัฒนาส่วนขยายเชลล์ของตนเองซึ่งแทนที่ลักษณะการทำงานแบบลากแล้วปล่อยและอนุญาตให้วางไฟล์ลงในโฟลเดอร์ด้านขวาได้ทันที พวกเขาอธิบายเคล็ดลับในเอกสารประกอบและน่าสนใจยิ่งขึ้นปัญหาคืออะไรและพวกเขาแก้ไขอย่างไร

นี่คือส่วนที่น่าสนใจ:

กลไกการลากและวางของ Windows ไม่อนุญาตให้แอปพลิเคชันต้นทางของการดำเนินการลากและวางสามารถค้นหาได้อย่างง่ายดายซึ่งมีการวางไฟล์ มันขึ้นอยู่กับแอปพลิเคชันเป้าหมาย (โดยปกติ Windows Explorer) เพื่อถ่ายโอนไฟล์ไปยังปลายทาง มันค่อนข้างสมเหตุสมผลเนื่องจากแอปพลิเคชันต้นทางสามารถถ่ายโอนไฟล์ไปยังปลายทางได้ยาก โปรดทราบว่าคุณสามารถวางไฟล์ไม่เพียง แต่ไปยังไดเรกทอรี แต่ยังไปยังไฟล์ ZIP (หรือไฟล์เก็บถาวรอื่น ๆ ), ไดเรกทอรีระยะไกล (ผ่าน FTP, SFTP, SCP, …), ถังขยะ, ...

เห็นได้ชัดว่าแม้แต่ Windows Explorer (หรือแอปพลิเคชันเป้าหมายอื่น ๆ เช่น WinZip) ไม่สามารถดาวน์โหลดไฟล์จากแหล่งที่เป็นไปได้ใด ๆ (โดยเฉพาะอย่างยิ่งมันไม่รู้จัก SFTP / SCP)

นอกจากนี้สำหรับ 7Zip: user ray023 ตอบคำถามนี้ใน SuperUser Stack Q&A: https://superuser.com/a/422463

โดยทั่วไปถ้าแทนที่จะลากไฟล์ของคุณคุณใช้วิธีการ "แยกที่นี่" ที่มีอยู่ใน Bith 7-ZIP และ Winrar ไฟล์จะถูกแยกโดยตรงไปยังไดเรกทอรีที่เหมาะสม


2
คำถามไม่ได้ "ทำไม 7zip ใช้ไฟล์ temp" คำถามที่แท้จริงคือ "ทำไมไฟล์ temp ที่ใช้กันทั่วไปในการพัฒนาซอฟต์แวร์?"
Phil

@Phil ตัวอย่างที่ให้มาคือจากสิ่งที่ฉันเข้าใจว่าจะเกิดอะไรขึ้นเมื่อคุณลากไฟล์หนึ่งไฟล์จากไฟล์เก็บถาวรไปยังโฟลเดอร์บนระบบโดยไม่ต้องขอให้ "แตกไฟล์" อย่างชัดเจน แต่ฉันอ่านคำถามอีกครั้งและใช่ฉันคิดว่าคุณถูกต้องที่ผู้เขียนต้องการทราบเพิ่มเติมเกี่ยวกับการใช้ประโยชน์ของโฟลเดอร์ชั่วคราวซึ่งวิธีนี้ได้รับการตอบกลับอย่างชำนาญโดย tdammers (+1 คะแนนจากฉันด้วย)
Jalayn

ในขณะที่คำตอบของคุณไม่ตรงกับสิ่งที่ฉันกำลังมองหา +1 สำหรับการแก้ปัญหาของฉันกับ 7zip
Devdatta Tengshe

1
ความคิดเห็นที่ดีโดยทั่วไปแล้วเดือดร้อนถึง: ทำไมโปรแกรมถึงใช้โฟลเดอร์ชั่วคราว เพราะเมื่อลากแล้วปล่อยมันไม่รู้จักโฟลเดอร์ปลายทางและเพียงแค่ "มอบให้" กับ windows ดังนั้น windows จึงเข้ามาแทนที่ไฟล์ดังกล่าว
ปีเตอร์ B

0

หากคุณต้องทำการประมวลผลข้อมูลใด ๆ ไปยังไฟล์ (ถอดรหัส / แปลง / ฯลฯ .. ) ดังนั้นจะเป็นการดีกว่าที่จะใช้ไฟล์ชั่วคราวและเมื่อเสร็จสิ้นและเมื่อเสร็จสมบูรณ์และหากเสร็จสิ้นแล้วให้โอนผลลัพธ์ไปยังปลายทางสุดท้าย

ประโยชน์ที่ได้รับ:

  1. ไฟล์ที่เสร็จแล้วมาถึงปลายทาง
  2. ไฟล์ชั่วคราวอาจ (ควร) อยู่ในสื่อที่รวดเร็ว
  3. หลีกเลี่ยงการแตกแฟรกเมนต์ในไฟล์สุดท้าย
  4. อนุญาตให้ใช้สื่ออื่นเป็นปลายทางสุดท้าย (ftp, cloud หรืออะไรก็ตาม)
  5. ไฟล์ temp ที่ถูกยกเลิกนั้นง่ายต่อการทำความสะอาด

ฉันไม่เห็นประโยชน์ที่แท้จริงของการเขียนตรงไปยังปลายทางในขณะที่กำลังประมวลผลข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.