예를 들면 다음과 같습니다.
var assets = "images/"
var sounds = assets+"sounds/"
파일 경로 뒤에 슬래시를 두는 것이 더 일반적인 방법입니까?
var assets = "/images"
var sounds = assets+"/sounds"
좋은 일반적인 방법이 또 있습니까?
File.separator
, File
and Path
API는 /
`와` 를 모두 받아들 입니다.
예를 들면 다음과 같습니다.
var assets = "images/"
var sounds = assets+"sounds/"
파일 경로 뒤에 슬래시를 두는 것이 더 일반적인 방법입니까?
var assets = "/images"
var sounds = assets+"/sounds"
좋은 일반적인 방법이 또 있습니까?
File.separator
, File
and Path
API는 /
`와` 를 모두 받아들 입니다.
답변:
거의 모든 주요 프로그래밍 언어에는 디렉토리 구분 기호를 처리하는 라이브러리가 있습니다. 당신은 그들을 활용해야합니다. 이것은 코드를 단순화하고 버그를 예방합니다 .
필자의 경험에 따르면 이와 같은 문자열을 결합하는 일반적인 이유는 다른 소스에서 온 것입니다. 때로는 구성 파일과 다른 부분입니다. 때로는 함수 인수와 상수 결합입니다. 어떤 경우이든, 서로 다른 출처에서 나온 경우 끝 부분의 구분 기호를 결합 할 수있는 여러 가지 가능한 경우를 고려해야합니다.
"images/"
및"/sounds"
"images"
하고 "/sounds"
또는 "images/"
및"sounds"
"images"
및"sounds"
각 부분이 다른 출처에서 나왔다는 사실은 누군가가 그것에 대해 전혀 생각하지 않았다면 각 출처가 따라야 할 규칙에 대한 자체 아이디어를 가질 수 있음을 의미합니다! 코드를 호출하는 것이 무엇이든 이것에 대해 걱정할 필요는 없습니다 . 누군가 귀하의 협약을 위반할 것이기 때문에 귀하의 코드는 모든 경우를 처리해야 합니다 . 이로 인해 오류의 원인을 조사하고 수정하는 데 시간이 낭비됩니다. 동료가 구성 파일에서 경로의 형식을 지정하는 방법에 대해 가정했을 때 몇 가지 불쾌한 경우가있었습니다. 즉, 코드를 찾아서 예상했던 것을 파악해야합니다 (또는 코드 수정).
대부분의 주요 언어는 이미 많은 경우를 처리하는 방법을 제공합니다.
os.path.join
파이썬File.join
루비Path.join
Node.js 용Paths.get
Java 용 (7 이상)Path.Combine
.NET 용이것들에 대한 경고가 있습니다. 이들 중 다수는 두 번째 인수에서 선행 디렉토리 구분 기호가 루트 경로를 참조하고 첫 번째 인수가 완전히 삭제되어야 함을 가정 한 것으로 보입니다. 이것이 왜 유용한 지 모르겠습니다. 나를 위해, 그것은 단지 문제를 일으킨다. 나는 두 개의 경로 부분을 결합하고 첫 번째 부분이 떨어지는 것을 끝내고 싶지 않았습니다. 특수한 경우 문서를주의 깊게 읽고 필요한 경우 특수 처리 대신 원하는 작업을 수행하는 래퍼를 작성하십시오.
다른 운영 체제를 지원해야 할 경우에도 도움이됩니다. 이 클래스는 거의 모든 곳에서 올바른 구분 기호를 선택합니다. 라이브러리에는 일반적으로 OS 규칙에 맞게 경로를 표준화하는 방법이 있습니다.
프로그래밍 언어에 쉽게 사용할 수있는 라이브러리가없는 경우 이러한 모든 경우를 처리하고 프로젝트 전체에서 자유롭게 사용할 수 있는 방법을 작성 해야 합니다.
이는 "가정을 만들지 않음"과 "도움이되는 도구 사용"범주에 속합니다.
C:\Documents and Settings\Admin
과 성공적으로 결합 할 수있는 라이브러리를 사용하여 귀여운 트릭을 만들었습니다. 그러나 실제로는 휴리스틱이 수정 한 것보다 더 많은 버그를 도입했습니다. my folder:document.txt
/home/admin/my folder/document.txt
Paths.get()
경우 단일 String
을 Path
객체 로 변환 합니다. 경로를 결합하려면을 사용합니다.이 경로 Path.resolve()
는 다른 경로 Path
또는 을 사용할 수 있습니다 String
. Path
클래스에는 다양한 방법으로 경로를 더 조인 할 수 있는 다른 메소드가 있습니다 .
Paths
잘 읽지 않은 것 같습니다 .
[System.IO.Path]::Combine("abc", "\def")
에서 설명 된 동작이있는 .NET 메서드의 대안 Join-Path "abc" "\def"
은 "abc\def"
.
자바에서 답은 "위의 어느 것도 아니다". 모범 사례는 java.io.File
클래스를 사용하여 경로 이름을 어셈블하는 것입니다 . 예 :
File assets = new File("images");
File sounds = new File(assets, "sounds");
이 File
클래스는 플랫폼 별 경로 이름 구분 기호도 처리합니다.
경로 이름이 슬래시로 시작해야하는지 여부에 대한 별도의 문제가 있습니다. 그러나 그것은 모범 사례보다 정확성과 관련이 있습니다. 슬래시로 시작 하는 경로 이름은 그렇지 않은 경로 이름 과 다른 것을 의미합니다 !!
ECMA (핵심) Javascript 라이브러리에는 명시 적으로 경로 이름 처리가 지원되지 않지만 Node.js는 Path 모듈을 통해 지원을 제공합니다.
os.path.join
. PowerShell에는 join-path
. 이 답변에 무언가를 추가 할 것입니다. 여러 부분으로 파일 경로가 필요한 경우 특정 위치에 파일 경로가있는 파일에 대해 가정하면 코드가 매우 취약 하다는 것을 알았 습니다. 이러한 클래스를 사용하면 이식성에 도움이 될뿐만 아니라 가능한 모든 경우를 처리합니다 (양단의 슬래시, 한쪽 만 슬래시, 슬래시 없음). 구성 파일에서 파일 경로를 삭제하면 이 유연성이 매우 중요 합니다.
.NET에서는 Path.Combine 메서드를 사용해야합니다.
var path = System.IO.Path.Combine("assets", "sounds");
폴더 이름을 구성 할 때 사용할 올바른 문자 를 '알기' 때문 입니다.
이것은 사전 또는 사후 수정의 '문제'를 제거합니다.
os.path.join('src', '../../../your_secret_stuff')
에서는 유효합니다. 다시 말해, 사용자 입력에이 방법을 맹목적으로 사용하지 마십시오.
폴더와 파일은 한 측면에서만 다릅니다. 폴더는 파일이없는 슬래시로 끝납니다. 또한 절대 경로 /
는 상대 경로가 아닌 위치로 시작합니다 . 이 일관된 연결 경로와 파일을 함께 사용하면 아무런 문제가 없습니다.
var absolutepath = "/my/path/";
var relativepath = "css/";
var filename = "test.css";
var relativepathtofilename = "js/test.js";
var a = absolutepath + relativepath + filename; //Output: /my/path/css/test.css
var b = absolutepath + relativepathtofilename; //Output: /my/path/js/test.js
두 개의 절대 경로를 함께 연결하면 두 번째 경로가 첫 번째 경로에 상대적이어야하므로 의미가 없습니다. 두 상대 경로를 함께 연결해도 문제는 없지만 프로그램이 상대 경로의 상대 위치를 모르는 경우 동작이 정의되지 않을 수 있습니다.
var a = "/my/path" + "css/" + "test.css"; //Output: "/my/pathcss/test.css"
absolutepath
경로이기 때문에 슬래시로 끝나야합니다. 어떻게 든 나는 이것을 쓸 때 그것을 간과했습니다.
나는 경로를 구현하는 방법에 대한 마술이나 "공통 관행"이 없다고 생각하지만 문자열 연결은 갈 길이 아닙니다. 사례를 처리하기 위해 자체 API를 개발할 수 있지만 약간의 노력이 필요할 수 있습니다. 특히, 다른 플랫폼에주의해야합니다. 예를 들어 Windows \
에서는 구분 기호가 있고 Unix 기반 시스템 /
에서는 구분 기호입니다.
Javascript 라이브러리에 익숙하지 않지만 이러한 경우를 처리하기위한 라이브러리가 있어야합니다. 예를 들어 Java에서는 Path API를 사용하여 플랫폼 독립적 인 경로 작업을 처리 할 수 있습니다 .
/
경로 파일 이름 구분 기호로 지원 합니다. 이것은 명령 행에 문제가 필요하지만 파일 I / O API는 슬래시와 잘 작동합니다.
내 개인적인 취향은 다음과 같습니다.
var assets = "/images"
var sounds = assets+"/sounds"
나는 항상 절대 경로 ( /images/...
)를 사용 하며 오류가 덜 발생합니다. 후행 슬래시가 있고으로 끝나 더라도 여전히 해결 var sounds = assets+"/sounds"
되기 때문에 사용하는 것이 더 어리석은 증거 입니다. 한 가지 면책 조항은 요청 핸들러에 따라 다릅니다. 아파치는 잘 처리하는 것 같습니다 (적어도 특정 버전 / 구성, http://www.amazon.com//gp//site-directory//ref=nav_sad 참조 ). 다른 방법으로 당신은 그렇게 바보 증거로 끝나지 않을 것입니다 :) 이중 슬래시를 확인하고 정리하는 옵션도 있습니다. 다른 접근 방식에는 옵션이 없습니다.assets
/images//sounds
/images/sounds
/imagessounds
/
)로 시작하는 경로 는 상대 경로 가 아니라 절대 경로입니다. 아니면 첫 번째 경로 이외의 경로 섹션에만 해당합니까?
/somewhere
호스트가 포함되어 있지 않기 때문에 상대 경로입니다. 따라서 브라우저는 현재 페이지의 호스트를 기반으로 검색합니다. 웹 세계에서는 http://here/somewhere
절대 URI /somewhereelse
이며 이에 상대적입니다. 파일 시스템 세계에서는 /somewhere
root /
에서 오는 절대적 이며 "somewhereelse"는 현재 작업 디렉토리와 관련이 있습니다.
http://here/somewhere
는 절대 경로가있는 URI이며 절대 경로 /somewhere
가있는 상대 참조이며 상대 경로 somewhere/else
가있는 상대 참조입니다. 분명히,이 원에서 "상대 경로"는 상대 참조를 나타내는 데 사용됩니다.
스몰 토크에서는 다음과 같이 작동하도록 String에서 / 메소드를 정의하는 것이 간단합니다.
'assets' / 'sounds' => 'assets/sounds'.
'assets/' / 'sounds' => 'assets/sounds'.
'assets' / '/sounds' => 'assets/sounds'.
'assets/' / '/sounds' => 'assets/sounds'.
다음은 메소드의 간단한 구현입니다 (더 좋게 만들 수 있습니다).
/ aString
| slash first second |
slash := Directory separator.
first := self.
(first endsWith: slash) ifTrue: [first := first allButLast].
second := aString.
(second beginsWith: slash) ifTrue: [second := second allButFirst].
^first , slash , second
참고 : 당신은 또한 다음과 같은 국경 경우에 더 관심을 지불 할 수 있습니다 '' / ''
, 'x/' / ''
적절한 행동을 결정하기 위해, 등.