2011-11-28 57 views

Trả lời

9

Bạn có thể os.unlink() trước tiên và sau đó tạo lại bằng cách sử dụng os.symlink() để trỏ đến mục tiêu mới.

6

Tôi đã nghiên cứu câu hỏi này gần đây và phát hiện ra rằng cách tốt nhất thực sự là unlink và sau đó là symlink. Nhưng nếu bạn chỉ cần để sửa chữa các liên kết bị hỏng, ví dụ với tính năng tự động thay thế, sau đó bạn có thể làm os.readlink:

for f in os.listdir(dir): 
    path = os.path.join(dir, f) 
    old_link = os.readlink(path) 
    new_link = old_link.replace(before, after) 
    os.unlink(path) 
    os.symlink(new_link, path) 
15

Một chức năng ít mà cố gắng liên kết mềm và nếu nó không thành công vì một tập tin hiện có, nó loại bỏ nó và liên kết lại.

import os, errno 

def symlink_force(target, link_name): 
    try: 
     os.symlink(target, link_name) 
    except OSError, e: 
     if e.errno == errno.EEXIST: 
      os.remove(link_name) 
      os.symlink(target, link_name) 
     else: 
      raise e 
12

Nếu bạn cần sửa đổi nguyên tử, hủy liên kết sẽ không hoạt động.

Một giải pháp tốt hơn là để tạo ra một liên kết tượng trưng tạm thời mới, và sau đó đổi tên nó trên hiện có:

os.symlink(target, tmpLink) 
os.rename(tmpLink, linkName) 

Bạn có thể kiểm tra để chắc chắn rằng nó đã được cập nhật một cách chính xác quá:

if os.path.realpath(linkName) == target: 
    # Symlink was updated 

Theo tài liệu hướng dẫn cho os.rename, có thể không có cách nào để thay đổi nguyên tử một liên kết tượng trưng trong Windows. Trong trường hợp đó, bạn chỉ cần xóa và tạo lại.

+4

Python 3.3 có 'os.replace' có thể được sử dụng thay vì 'os.rename' để cung cấp cùng một hành vi trên các hệ thống Posix & Windows. – Tom

0

Đừng quên để thêm một lệnh tăng lương trong trường hợp khi e.errno = errno.EEXIST Bạn không muốn để ẩn một lỗi sau đó:

if e.errno == errno.EEXIST: 
    os.remove(link_name) 
    os.symlink(target, link_name) 
else: 
    raise 
Các vấn đề liên quan