Một biến đường dẫn thư mục có nên kết thúc bằng dấu gạch chéo không?


85

Khi xác định một đường dẫn đến một thư mục là một biến hoặc một hằng số, nó có nên kết thúc bằng dấu gạch chéo không? Quy ước là gì?

pwdtrong Unix hiển thị thư mục hiện tại của bạn mà không có dấu gạch chéo, trong khi tab hoàn thành cd /var/www/apps/bao gồm dấu gạch chéo, điều này khiến tôi không chắc chắn.

Câu trả lời:


23

Tôi không bao gồm dấu gạch chéo ở cuối khi tôi, ví dụ, xác định một thư mục để lưu trữ tệp. Đó là bởi vì tôi sẽ sử dụng nó như

$store_file = "$store_path/$file_id";

Tôi sẽ luôn thêm dấu gạch chéo trước khi sử dụng biến được cho là giữ đường dẫn thư mục. Tôi nghĩ rằng tốt hơn là luôn thêm một dấu gạch chéo hơn là tự hỏi liệu dấu gạch chéo ở cuối có được bao gồm hay không.


29
Không có dấu gạch chéo có nghĩa là không rõ đường dẫn trong $ store_path là một tệp hay một thư mục. "/ tmp / store_data" là tệp hay thư mục?
Darwin

4
Khi sử dụng một cái gì đó như hàm realpath () của PHP , nó sẽ không in dấu gạch chéo. Hệ thống và công cụ của bạn có thể quyết định quy ước của bạn.
jmbertucci 27/12/12

10
Có nhiều dấu gạch chéo ở bất cứ đâu thường sẽ được hiểu là một dấu gạch chéo. Vì vậy, bạn thậm chí có thể có một cái gì đó giống như '///' + $root + '//' + $file + '/'và nó sẽ không thành vấn đề. Mặc dù có dấu gạch chéo là một cách tốt để phân biệt liệu đường dẫn có phải là tệp hay thư mục hay không, nhưng tốt hơn là bạn nên thêm vào các đường dẫn như thế '/' + $rootthay $root + '/'vì bạn không thể khẳng định rằng đường dẫn được thêm vào có dấu gạch chéo , nhưng bạn có thể tương đối yên tâm rằng nhiều dấu gạch chéo sẽ được hiểu là một dấu gạch chéo trong hầu hết các môi trường.
Xtrinity

3
@MatthewSlyman, Quan điểm của tôi là tất cả mọi người rằng hy vọng này /tmp/store_data/là một thư mục, trong khi nó không rõ ràng những gì con đường cùng mà không có một dấu gạch chéo traling là/tmp/store_data
Darwin

6
Vấn đề ở đây là: Nếu một biến không tồn tại, nó cũng giống như trống rỗng, và rm -rf $foo/$barcó thể kết thúc trongrm -rf /
12431234123412341234123

100

Tôi đi theo dấu gạch chéo vì:

  1. "Nếu nó kết thúc bằng một dấu gạch chéo, đó là một thư mục. Nếu không, đó là một tệp." là một quy ước dễ nhớ.

  2. Ít nhất là trên các hệ điều hành tôi thường sử dụng, việc tăng gấp đôi dấu gạch chéo không gây ra vấn đề gì, trong khi bỏ qua dấu gạch chéo gây ra những vấn đề lớn. Do đó, an toàn nhất là đặt dấu gạch chéo vào biến và sử dụng "$ path / $ file" khi sử dụng nó.


9
Đường dẫn thư mục chỉ có thể phân biệt được với đường dẫn tệp nếu đường dẫn thư mục có dấu gạch chéo.
Darwin

4
Nhiều dấu gạch chéo tương đương với một dấu gạch chéo, trừ khi đường dẫn bắt đầu bằng dấu gạch chéo kép. Xem unix.stackexchange.com/questions/1910/…
jdh8

4
Ngoài ra, việc thêm dấu gạch chéo ở cuối vaariable cho phép "$ path $ file" thay vì "$ path / $ file", cho phép $ path trống - nghĩa là thư mục làm việc hiện tại. Nhưng đừng bao giờ sử dụng dấu gạch chéo ngược thay vì dấu gạch chéo.
fantastory

Tập tin mô tả là hữu ích quá
Francesco Gualazzi

@ jdh8 Ngay cả khi đường dẫn bắt đầu bằng hai dấu gạch chéo, nó vẫn phải tương đương với một dấu gạch chéo. Mặc dù điều này có thể thay đổi từ triển khai này sang triển khai khác. Các tiêu chuẩn unix nói rằng A pathname that begins with two successive slashes may be interpreted in an implementation-defined manner, although more than two leading slashes shall be treated as a single slash.Đối với hầu hết các phần, người ta quan sát thấy rằng dấu gạch chéo kép thường được hiểu là một dấu gạch chéo duy nhất trong các triển khai phổ biến.
Xtrinity

11

Tôi biết rằng đây là 10 năm tuổi, nhưng tôi muốn ném 0,02 đô la rất cố chấp của mình.

Không, hoàn toàn không.

Chúng ta đang nói về một hệ thống Unix. Tham chiếu đến chính thư mục, nó là một nút giống như bất kỳ nút nào khác. Khi đề cập đến các thư mục, nó sẽ không bao giờ có một dấu gạch chéo unescaped trong tên của nó (ref: dirname, pwd, ~, echo $HOME, echo $PATH, sản lượng từ ls, et al).

Khi đề cập đến nội dung của một thư mục, sau đó bạn cần một dấu gạch chéo. Điều đó có nghĩa ls /home/karl/là thích hợp hơn ls /home/karl(FTR, tôi hầu như luôn luôn làm sau vì ... à, lười biếng).

Khi sử dụng một biến có chứa thư mục để tạo đường dẫn đầy đủ đến tệp, bạn sẽ luôn mong đợi bao gồm dấu gạch chéo (i., E cp ${HOME}/test ${OTHER_DIR}/:).

Người ta mong đợi rằng một thư mục không kết thúc bằng một dấu gạch chéo. Mọi kỳ vọng rằng một thư mục kết thúc bằng dấu gạch chéo đều là sai. Do đó, việc thêm dấu gạch chéo vào cuối *_DIRgiá trị của một biến sẽ làm giảm kỳ vọng.

Đối với việc hoàn thành tab, kỳ vọng ở đây là bạn đang đi vào thư mục đó. Do đó, sự hỗ trợ được cung cấp bởi việc hoàn thành tab là đưa bạn vào thư mục đó để bạn có thể đưa ra lựa chọn tiếp theo dựa trên nội dung của nó.

(tham khảo từ các bình luận: Filepath Sai lầm , từ trang Wikipedia Talk:Path_(computing). Cảm ơn, john cj )

Cần lưu ý rằng chỉ vì nó sai không có nghĩa là các công cụ / gói / thư viện không bao giờ làm điều đó. Việc những thứ như vậy thêm dấu gạch chéo vào cuối khi không tồn tại là một chuyện quá phổ biến. Do đó, như BevanPaul F đều đề xuất, khi sử dụng các công cụ của bên thứ 3, cách tốt nhất là loại bỏ bất kỳ dấu gạch chéo nào có thể tồn tại trong tên thư mục.

Unix Inodes

Inode (nút chỉ mục) là một cấu trúc dữ liệu trong hệ thống tệp kiểu Unix mô tả một đối tượng hệ thống tệp như tệp hoặc thư mục.

- https://en.wikipedia.org/wiki/Inode

Tiêu chuẩn phân cấp hệ thống tệp

Các tiêu chuẩn cho hệ thống tập tin Unix (các Filesystem Hierarchy Standard, AKA đảm bảo VSATTP) cho thấy rõ ràng rằng các thư mục không được coi là có một dấu gạch chéo, mà đúng hơn là nội dung thư mục bắt đầu với một dấu gạch chéo (ngoại lệ duy nhất cho điều này là /bởi vì chúng ta sẽ không đề cập đến gốc hệ thống tệp bằng cách sử dụng một chuỗi trống ... và người ta sẽ không bao giờ tạo tệp ở đó.)

- http://www.pathname.com/fhs/pub/fhs-2.3.html

- https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard


Câu trả lời xuất sắc. Tôi có xu hướng sử dụng cách tiếp cận này nhưng chưa bao giờ hoàn toàn đầy đủ về lý do của tôi tại sao. Đây là câu trả lời duy nhất đóng đinh nó.
wardw

4
Đó là gốc /phá vỡ khuôn mẫu. Và nếu bạn bắt đầu lập luận của mình từ đây (một cách đệ quy) thì bạn có thể đi đến những mâu thuẫn có thể là trung tâm của các thực hành phân kỳ (được chứng minh từ các câu trả lời ở đây). Nhưng một khi bạn chấp nhận điều này là ngoại lệ thì mọi thứ khác sẽ xếp hàng.
wardw

Tôi hiểu rồi. Đã chơi một chút với dirname. Nếu bạn định lưu trữ rõ ràng một thư mục trong một đường dẫn, hãy kết thúc đường dẫn bằng dấu “/.”, Trong đó dấu chấm biểu thị thư mục hiện tại.
TamusJRoyce

Bạn sẽ không bao giờ kết thúc a bằng a /., đây chỉ là một ý tưởng khủng khiếp; ngoài việc đưa nội dung rất bất thường dẫn đến rắc rối không mong muốn, nó trông thật ngớ ngẩn.
Karl Wilbur

2
@wardw, bạn có thể nghĩ rằng thư mục gốc được đặt tên là chuỗi rỗng, trong khi "/" là một chuỗi rỗng theo sau là dấu gạch chéo và có nghĩa là "nội dung của thư mục gốc".
bobpaul

9

Có, nó phải, như:

Tên đường dẫn + tên tệp = vị trí tệp đủ điều kiện.

VẬY dấu gạch chéo giữa thư mục cuối cùng và tên tệp cần phải ở cuối tên đường dẫn hoặc đầu tên tệp. Tiền tố tên tệp bằng dấu / có nghĩa là bạn cần phải tính đến điều này nếu bạn chỉ muốn mở một tệp (tức là nếu bạn giả sử rằng tên tệp không đủ tiêu chuẩn nằm trong thư mục làm việc hiện tại).


5
.. và thất bại trong việc đưa nó vào tài khoản phương tiện bạn có thể vô tình rối tung với /, và đó là những lời dối trá cách điên rồ
JustJeff

5

Bất cứ khi nào tôi lưu trữ các đường dẫn thư mục hoặc trả lại chúng từ các API, tôi đều thử và tuân theo quy ước giữ dấu gạch chéo. Điều này tránh được sự mơ hồ toàn bộ 'nó là một tệp hay một thư mục'.

Phụ lục :
Điều này không nhằm mục đích thay thế cho việc sử dụng các phương pháp có thể chịu được dấu gạch chéo hoặc sự vắng mặt của nó. Ngay cả khi sử dụng quy ước này, tôi vẫn luôn sử dụng Path.Combine(...)và các phương pháp tương tự.


python:os.path.join(dir, subdir_or_file)
IceArdor

5

Có lẽ bạn nên nghĩ về quyết định của mình có ý nghĩa như thế nào đối với các tệp. Nếu bạn không bao gồm dấu gạch chéo ở cuối tên thư mục, bạn sẽ phải thêm nó vào đầu tên tệp .

Bây giờ, nếu vì lý do nào đó, đường dẫn đến tệp bị thiếu khi bạn nối các chuỗi, bạn sẽ kết thúc với một cái gì đó giống như /filenamekhông chỉ là tệp mà là một đường dẫn tuyệt đối từ thư mục gốc (bất cứ nơi nào có thể nằm trong ngữ cảnh đó) .

Đó là lý do tại sao tôi kết thúc các đường dẫn của mình bằng một dấu gạch chéo và giữ các tệp dưới dạng tệp.


1
Giải pháp thay thế ở đây là thể hiện tên tệp của bạn là ./filename. Nhưng nói chung, mã phải có trách nhiệm nối các đường dẫn để thực hiện đúng - và không đưa ra các giả định theo cách nào đó.
wardw

4

Tôi biết đây là một chủ đề cũ nhưng tôi nghĩ tôi sẽ chia sẻ những gì tôi làm. Nếu có thể, tôi thường cho phép cả hai và làm điều gì đó như sau (nếu đó là PHP):

$fullPath = rtrim($directory, '/') . '/filename.txt');

Bằng cách đó, nếu thư mục được xác định trong một tệp cấu hình, thì việc người tiếp theo thay đổi nó có bao gồm dấu gạch chéo hay không không quan trọng.


4

Trong php, vì hàm dirname (__ FILE __) trả về tên thư mục mà không có dấu gạch chéo ở cuối. Tôi có xu hướng gắn bó với quy ước đó.

Nếu không, việc sử dụng dấu gạch chéo ở cuối tên thư mục sẽ xung đột với cách hoạt động của dirname (..) và sau đó bạn gặp khó khăn với việc xử lý hai trường hợp vì bạn không biết liệu tên thư mục có phải là tên dirname (..) ) hoặc một nội dung được xác định bằng dấu gạch chéo.

Kết luận: Không sử dụng dấu gạch chéo vì dirname (..) thì không.

// PHP Example
dirname(__FILE__); // returns c:\my\directory without a trailing slash, so stick to it!

Đối với các ngôn ngữ khác, hãy kiểm tra hàm trích xuất tên đường dẫn và xem nó có sử dụng dấu gạch chéo hay không, sau đó tuân theo quy ước của ngôn ngữ.


2
Một ngoại lệ: dirname ('/ test') = '/' - thay vì trả về một chuỗi trống, dirname trả về một dấu gạch chéo trong trường hợp này! Xem ghi chú tại đây .
Matthew Slyman

3

Tôi có xu hướng chỉ thêm dấu gạch chéo vì tôi có nhiều khả năng sẽ sử dụng thư mục đó để thêm / truy xuất tệp ...

Về mặt tham chiếu web, nó thực sự có thể tăng hiệu suất để lại dấu gạch chéo ở

http://www.netmechanic.com/news/vol4/load_no11.htm


2

Có, có rất nhiều hệ thống tệp hỗ trợ tệp không có bất kỳ phần mở rộng nào, vì vậy hãy luôn thêm dấu gạch chéo để tránh bất kỳ sự cố nào.


1

Tôi chưa bao giờ thấy một quy ước chắc chắn theo cách này.

Tuy nhiên, khá chắc chắn rằng bất cứ điều gì bạn giải quyết, người khác sẽ chắc chắn 100% rằng nó sẽ theo cách khác. Vì vậy, ý tưởng tốt nhất là chấp nhận mọi thứ đang diễn ra theo cách nào đó.

Trong thế giới .NET, Path.Combine () cung cấp cho bạn một cách để xử lý điều này - có các tính năng tương đương trong các môi trường khác, từ các tệp cmd trở lên.


1

Tôi đoán đây là một trong những trường hợp hiếm hoi mà câu trả lời đúng về mặt lý thuyết và thực tế là khác nhau.

Có vẻ như câu trả lời của @Karl Wilbur chắc chắn là đúng theo nghĩa lý thuyết, vì bạn sẽ có thể phân biệt một tham chiếu đến chính nút thư mục với nội dung của thư mục.

Nhưng trong thực tế, tôi sẽ tranh luận câu trả lời đúng là ngược lại:

  • Lý do quan trọng nhất là bạn có thể chắc chắn rằng đường dẫn /home/FSObjectX/là một thư mục, trong khi đó /home/FSObjectXlà không rõ ràng. Không ai có thể biết đây có phải là một tập tin thư mục hay không.
    Thông số kỹ thuật phải luôn chính xác và rõ ràng bất cứ khi nào có thể.

  • Trong phần lớn các trường hợp, bạn sẽ luôn luôn tham chiếu đến nội dung của một thư mục, không phải chính nút dir.
    Trong những trường hợp hiếm hoi mà bạn thực sự làm như vậy, nó có thể dễ dàng được xử lý trong mã bằng cách loại bỏ bất kỳ dấu phân cách ở cuối tùy chọn nào.

  • Sử dụng bộ phân tách hai dir sẽ không gây hại gì, mặc dù chắc chắn sẽ thiếu một bộ phân tách.
    Về lý thuyết, một đối số tồi là bạn không nên viết mã một cách "tình cờ", nhưng trong thực tế, lỗi xảy ra và có lẽ việc sử dụng dir-sep ở cuối có thể dẫn đến ít lỗi thời gian chạy hơn ở người dùng cuối.

Đọc qua chủ đề thú vị này, tôi không tìm thấy bất kỳ nhược điểm nào của việc sử dụng dir-sep dấu, chỉ là nó sai về mặt lý thuyết. Hay tôi đã bỏ lỡ điều gì đó?


trong thực tế thực tế, bạn sẽ thấy rằng kỳ vọng thích hợp không chứa dấu gạch chéo. Chỉ cần xem xét mọi công cụ mà bạn sử dụng được viết bởi các nhà phát triển có năng lực.
Karl Wilbur
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.