Lợi ích của việc viết vào một vị trí tạm thời, và sau đó sao chép nó đến đích dự định là gì?


48

Tôi đang viết một ứng dụng hoạt động với hình ảnh vệ tinh và ông chủ của tôi đã yêu cầu tôi xem xét một số ứng dụng thương mại và xem cách chúng hoạt động. Tôi tìm thấy một hành vi kỳ lạ và sau đó khi tôi đang tìm kiếm, tôi cũng tìm thấy nó trong các ứng dụng tiêu chuẩn khác.

Các chương trình này trước tiên ghi vào thư mục tạm thời, sau đó sao chép nó vào đích dự định.

Ví dụ: 7zip đầu tiên trích xuất vào thư mục tạm thời, sau đó sao chép dữ liệu được trích xuất vào vị trí mà bạn đã yêu cầu để trích xuất dữ liệu.

Tôi thấy một số vấn đề với phương pháp này:

  1. Thư mục tạm thời có thể không có đủ không gian, trong khi vị trí dự định có thể có nhiều không gian đó.

  2. Nếu nó là một tệp lớn, nó có thể mất một lượng thời gian không đáng kể cho hoạt động sao chép.

Tôi đã nghĩ về nó rất nhiều, nhưng tôi không thể thấy một điểm tích cực duy nhất để làm điều này. Tôi đang thiếu một cái gì đó, hoặc có một lợi ích thực sự để làm điều này?


Nếu ứng dụng yêu cầu, hãy làm nó. Nếu không, hãy làm những gì có ý nghĩa. Bộ não của bạn đang nói với bạn rằng nó không cần thiết trong trường hợp này. Tôi đang ở trong trại thực hiện ít công việc nhất có thể như bạn có thể nói bằng câu trả lời của tôi vì vậy tôi khuyên bạn nên thực hiện ít công việc nhất có thể cho ứng dụng.
Jason Sebring

1
Bạn có chắc chắn đó là "sao chép" tập tin và không "di chuyển" nó? Sự khác biệt lớn.
frankc

Từ blogs.rsa.com/... , cho malware, lợi thế là 1) tránh writability Đảm bảo "lỗi màu đỏ" phát hiện trước khi bạn đã tải về hoàn toàn thậm chí virus vào máy tính của người sử dụng 2) đĩa TEMP thường nhanh hơn (RAMDisk) giảm thời gian cho phát hiện trong khi virus vẫn đang trong giai đoạn tải xuống (một khi virus đã được hình thành đầy đủ và quản lý để thực thi trong 0,05 giây, trò chơi kết thúc, vì vậy đó là một cuộc đua của thời gian)
Pacerier

3) Trong khi bạn vẫn đang tải xuống hoặc chạy, nếu một phần mềm chống vi-rút xâm nhập vào bạn (đôi khi không biết, đôi khi) và khiến xương của bạn nằm xung quanh, bạn vẫn có thể tin tưởng vào khả năng x% mà HĐH hoặc người dùng sẽ vô tình giúp bạn xóa xương chết của bạn, trong khi chúng là những thứ dọn dẹp hàng loạt từ thư mục TEMP, điều này giúp giảm xác suất phát hiện.
Pacerier

Câu trả lời:


96

Một vài lý do tôi có thể nghĩ ra:

  • Trên hầu hết các nền tảng, di chuyển tệp là nguyên tử, nhưng ghi tệp thì không (đặc biệt là nếu bạn không thể ghi tất cả dữ liệu trong một lần). Vì vậy, nếu bạn có mẫu nhà sản xuất / người tiêu dùng điển hình (một quy trình tạo tệp, thì quy trình kia sẽ xem một thư mục và chọn mọi thứ nó tìm thấy), viết vào thư mục tạm thời trước và sau đó chuyển đến vị trí thực có nghĩa là người tiêu dùng không bao giờ có thể nhìn thấy hồ sơ chưa hoàn thành.
  • Nếu quá trình ghi tệp bị chết giữa chừng, bạn có một tệp bị hỏng trên đĩa của mình. Nếu nó ở một vị trí thực sự, bạn phải tự làm sạch nó, nhưng nếu nó ở một vị trí tạm thời, hệ điều hành sẽ chăm sóc nó.
  • Nếu tệp tình cờ được tạo trong khi một công việc sao lưu đang chạy, công việc có thể nhận một tệp chưa hoàn chỉnh; thư mục tạm thời thường được loại trừ khỏi các bản sao lưu, vì vậy tệp sẽ chỉ được đưa vào một khi được chuyển đến đích cuối cùng.
  • Thư mục tạm thời có thể nằm trên một hệ thống tệp nhanh nhưng dễ bay hơi (ví dụ: ramdisk), có thể có ích cho những việc như tải xuống một số đoạn của cùng một tệp hoặc xử lý tại chỗ trên tệp với nhiều tìm kiếm. Ngoài ra, các thư mục tạm thời có xu hướng gây ra sự phân mảnh nhiều hơn các thư mục ít đọc, ghi và xóa thường xuyên hơn và giữ thư mục tạm thời trên một phân vùng riêng biệt có thể giúp phân mảnh các phân vùng khác xuống.

TL; DR - chủ yếu tập trung vào tính nguyên tử, nghĩa là bạn muốn làm cho nó sao cho (tại vị trí cuối cùng) tệp hoàn chỉnh hoặc không có ở bất kỳ thời điểm nào.


12
Nếu thư mục tạm thời nằm trên một phân vùng riêng, bạn sẽ mất tính nguyên tử.
yfeldblum

16
Một số chương trình sẽ trích xuất / sao chép vào thư mục dự định, nhưng chúng sẽ sử dụng phần mở rộng tệp tạm thời (ví dụ .tmp) và đổi tên nó khi hoàn tất.
Dan Diplo

5
Thỉnh thoảng ghi vào tệp tạm thời cũng hữu ích khi một số phiên bản chương trình của bạn có thể cố gắng tải lên cùng một tệp cùng một lúc và bạn không thể dựa vào hệ thống tệp để cung cấp mức khóa phù hợp (như API lưu trữ đám mây được xác định kém) . Sử dụng tệp tạm thời sẽ đảm bảo tệp kết quả sẽ không kết thúc với sự pha trộn dữ liệu từ cả hai lần tải lên. Tất nhiên đây chỉ là một ví dụ khác của nguyên tử.
Krzysztof Kozielchot

1
Trường hợp của Dan Diplo rất hữu ích khi cập nhật một tập tin hiện có. Bạn không muốn thay thế cái cũ cho đến khi cái mới được viết thành công, kẻo viết cái mới thất bại hoặc cái gì khác đọc cái mới trước khi nó được viết hoàn chỉnh.
RalphChapin

1
Thật không may mặc dù các thư mục OS Temp bị xáo trộn với các tệp và thư mục cũ vì HĐH không dọn sạch! Vì vậy, chúng tôi là nhà phát triển vẫn nên làm sạch nó! superuser.com/questions/296824/ từ
markmnl 30/11/14

15

Đây dường như là một vấn đề trong Windows, cụ thể hơn liên quan đến cách quản lý kéo thả.

Các nhà phát triển của ứng dụng khách WINSCP đã phát triển phần mở rộng shell của riêng họ, ghi đè hành vi kéo thả này và cho phép thả tệp vào thư mục bên phải ngay lập tức. Họ giải thích mánh khóe trong tài liệu của họ và thú vị hơn, vấn đề là gì và cách họ giải quyết nó.

Đây là phần thú vị:

Cơ chế kéo và thả của Windows không cho phép ứng dụng nguồn của hoạt động kéo và thả dễ dàng tìm ra, nơi các tệp bị rơi. Tùy thuộc vào ứng dụng đích (thường là Windows Explorer) để truyền tệp đến đích. Nó khá hợp lý, vì ứng dụng nguồn khó có thể chuyển tệp đến tất cả các đích có thể. Hãy nhớ rằng bạn có thể thả các tệp không chỉ vào một thư mục, mà ngay cả tệp ZIP (hoặc bất kỳ kho lưu trữ nào khác), thư mục từ xa (thông qua FTP, SFTP, SCP, Lỗi), thùng rác, Lỗi

Rõ ràng, ngay cả Windows Explorer (hoặc bất kỳ ứng dụng mục tiêu nào khác, như WinZip) không thể tải xuống các tệp từ bất kỳ nguồn nào có thể (đặc biệt là nó không biết SFTP / SCP).

Ngoài ra, cụ thể cho 7Zip: người dùng ray023 trả lời câu hỏi này trong Hỏi & Đáp về SuperUser Stack: https://superuser.com/a/422463

Về cơ bản, nếu thay vì kéo thả tệp của bạn, bạn sử dụng phương thức "giải nén tại đây" có sẵn trong bith 7-ZIP và Winrar, các tệp được trích xuất trực tiếp vào thư mục bên phải.


2
Câu hỏi không phải là "Tại sao 7zip sử dụng tệp tạm thời?" Câu hỏi thực tế là "Tại sao các tệp tạm thời thường được sử dụng trong phát triển phần mềm?"
Phil

@Phil Ví dụ được đưa ra là, từ những gì tôi hiểu, điều gì xảy ra khi bạn kéo một tệp từ kho lưu trữ vào một thư mục trên hệ thống mà không yêu cầu "giải nén" một cách rõ ràng. Tuy nhiên, tôi đã đọc lại câu hỏi, và vâng, tôi nghĩ rằng bạn đúng khi tác giả muốn biết thêm về tiện ích của các thư mục tạm thời, do đó đã được tdammers trả lời một cách thuần thục (+1 do tôi bình chọn)
Jalayn

Trong khi câu trả lời của bạn không chính xác như những gì tôi đang tìm kiếm, +1, để giải quyết vấn đề của tôi với 7zip
Devdatta Tengshe

1
Nhận xét tốt về cơ bản nắm rõ: tại sao một chương trình sử dụng thư mục tạm thời? Bởi vì khi kéo và thả nó không biết thư mục đích và chỉ "đưa nó" cho các cửa sổ, sau đó các cửa sổ sẽ tiếp quản và đặt tệp vào đúng vị trí.
Pieter B

0

Nếu bạn phải thực hiện bất kỳ loại xử lý dữ liệu nào cho tệp (giải mã / chuyển đổi / vv ..), thì tốt hơn là sử dụng tệp tạm thời và khi hoàn thành, và chỉ khi hoàn thành, hãy chuyển kết quả đến đích cuối cùng.

Những lợi ích:

  1. Chỉ các tệp hoàn thành đạt đến đích
  2. Tệp tạm thời có thể (nên) nằm trong phương tiện nhanh
  3. Tránh phân mảnh trên tập tin cuối cùng
  4. Cho phép sử dụng các phương tiện khác làm đích đến cuối cùng (ftp, đám mây, bất cứ điều gì)
  5. Các tập tin tạm thời bị hủy bỏ dễ dàng hơn để làm sạch

Tôi không thấy lợi ích thực sự của việc viết thẳng đến đích trong khi xử lý dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.