2011-12-10 39 views
7

Tôi đang sử dụng chức năng đổi tên (C, dưới ubuntu) để di chuyển tệp từ thư mục này sang thư mục khác khi đang cố gắng: rename("./t2.c", "./this/then_this/it_works.c"); nó hoạt động kỳ diệu, xóa tệp khỏi thư mục hiện tại và di chuyển tệp đó đến thư mục then_this dưới tên.Đổi tên tệp thành thùng rác

nhưng khi tôi cố gắng này: rename("./t2.c", "~/.local/share/Trash/files/it_works.c"); nó chỉ không làm việc, nhưng trong đánh máy thiết bị đầu cuối trong "cd ~/.local/share/Thùng rác/files/it_works.c" không mở thùng rác.

Vì vậy, những gì tôi đang cố gắng làm là di chuyển tệp vào thùng rác (xóa nó). Bất cứ ai có thể cho tôi biết những gì tôi đang làm sai?

+0

Bạn đang sử dụng hệ điều hành nào? –

Trả lời

9

Vấn đề là ~ chỉ hoạt động trong trình bao. Thay thế bằng đường dẫn tuyệt đối đầy đủ (ví dụ: /home/user1031204/.local/...) & thử lại.

+0

nhiều cảm ơn nó hoạt động: D nhưng nếu tôi muốn sử dụng điều này ở một nơi khác? tôi sẽ cần phải tìm hiểu tên người dùng của họ sẽ không? – user1031204

+2

@ user1031204: Bạn có thể sử dụng 'getuid()' kết hợp với 'getpwuid_r()' để tìm ra thư mục chính của người dùng (xem 'pw_dir'). – NPE

+0

cảm ơn bạn rất nhiều vì đã giúp đỡ bạn !!! – user1031204

4

~ là phím tắt tiện dụng chỉ có sẵn trong trình bao. Bạn có thể đạt được một hành vi tương tự bằng cách sử dụng getenv("HOME") và nối nó với thư mục đích.

snprintf(buffer, size_of_buffer, "%s/.local/share/Trash/files/it_works.c", 
     getenv("HOME")); 

Hãy nhớ #include <stdlib.h> và có một bộ đệm mà là dài ít nhất PATH_MAX byte (limits.h) để lưu trữ kết quả.

+0

Tôi sẽ xem xét nó ngay bây giờ, cảm ơn nhiều – user1031204

+0

Không ai có thể dự đoán kết quả sẽ là bao lâu. Các biến môi trường có thể chứa nhiều dữ liệu như người dùng muốn. Ưu tiên 'snprintf', cho phép bạn thông báo kích thước bộ đệm tối đa, nếu không ứng dụng của bạn dễ bị ngăn xếp hoặc tràn bộ nhớ, ví dụ:' $ HOME = \ 'perl -e 'print" A "x 4096' \'; ./your_program'. – jweyrich

+0

@jweyrich, điểm tốt, tôi đã cập nhật câu trả lời. – Jan

4

realpath() sẽ hữu ích ở đây. Bạn cũng có thể xem glob()wordexp().

+0

oh cảm ơn, chắc chắn có vẻ hữu ích: D cảm ơn bạn – user1031204

+0

+1. Những gợi ý hay. – jweyrich

+0

realpath() sẽ không hoạt động với biểu tượng dấu ngã (không may) – timbo

Các vấn đề liên quan