원하는 Location 획득하기 또는 만들기
Location은 파일 시스템에서 엔트리(파일, 폴더, 링크)들의 경로 또는 주소입니다. 원하는 위치를 획득하거나 만드는 방법은 여러 가지가 있습니다. 그 중 일부는 플랫폼 종속적입니다.
다음 샘플 작업을 하려면, InputOutput 모듈을 반드시 초기화해야 합니다. (=> 더 많은 정보)
- 가장 일반적인 방법은 DG 모듈이 제공하는 플랫폼 독립적인 파일 선택 다이얼로그를 이용하는 것입니다.
이 다이얼로그는 선택한 파일 시스템 엔트리를 참조하는 Location 객체를 리턴합니다:
#include "DG.h" // 파일 선택 다이얼로그를 가져옴 (Location도 포함)
IO::Location loc; if (!DGGetOpenFile (&loc)) { // loc에 선택한 위치를 리턴 // 파일 (폴더, 링크) 위치를 선택하지 않았음 }
- InputOutput 모듈로부터 쿼리할 수 있는 몇 가지 특수 위치들이 있습니다. 여기에는 실행 중인 애플리케이션의 부모 폴더, 데스크톱 폴더 등이 있습니다.
이것은 다음과 같이 fileSystem이라는 class FileSystem의 단일 인스턴스를 사용하여 가져올 수 있습니다:
#include "FileSystem.hpp" // class FileSystem을 사용하는 데 필요한 모든 것을 가져옴 (예. Location)
IO::Location appFolderLoc; // 실행 중인 애플리케이션의 폴더의 위치를 보관하게 됨 GSErrCode errorCode = IO::fileSystem.GetSpecialLocation (IO::FileSystem::ApplicationFolder, &appFolderLoc);
- 위치를 생성하는 가장 간단한 방법은 기본 Location 생성자를 이용하는 것입니다:
#include "Location.hpp"
IO::Location localRoot;
이 위치는 현재 머신의 파일 시스템의 루트를 참조합니다. 만약 이 위치로부터 생성된 Folder 인스턴스의 내용을 열거하면, Windows와 Macintosh 모두 볼륨(논리적 드라이브)들을 얻게 될 것입니다. Windows의 경우 A: 또는 C: 입니다.InputOutput 모듈은 이미 IO::localRoot로 public 기본 Location 인스턴스를 갖고 있습니다. 상수로 선언되어 있습니다.
- Location은 "전체 경로"(주소)의 현재 플랫폼의 텍스트 표현으로 생성할 수 있습니다:
#include "Location.hpp"
// Windows 표현 IO::Location loc1 ("C:/A/B/f.exe"); // Macintosh 표현 IO::Location loc2 ("System:A:B:f");
이 솔루션은 플랫폼 종속적입니다. 이것은 경로 delimiter 문자(/ 및 :)와 볼륨(논리적인 드라이브) 이름의 표현 차이가 있기 때문입니다. 게다가 Macintosh의 경우 네트워크 주소에 대하여 텍스트 표현식이 존재하지 않습니다. (Windows의 경우 "//Server/Share/Folder1/Folder2/FileName"과 같은 표현식을 사용함)
- Location은 존재하지 않은 "lan:" 프로토콜(LAN = Local Area Network)을 이용하여 "전체 경로"(주소)의 URL 스타일 표현으로 생성할 수 있습니다.
이 방법은 경로 delimiter 문자의 차이점을 없애줍니다. 구문은 다음과 같습니다:
"lan://" networkAddress "/" localAddress
networkAddress = (networkName ("." networkName)*)? | "localhost"
localAddress = (localName ("/" localName)*)?
'*'는 0 이상을 의미하고 '?'는 0 또는 1 (선택사항)을 의미하고 '|'는 OR를 의미합니다. networkName은 아무 문자를 포함할 수 있지만 '.'는 불가능한 반면, localName은 아무 문자를 포함할 수 있으나 '/'는 불가능합니다.
URL 네트워크 주소(호스트)는 역순으로 표현된다는 것을 참고하십시오. 즉, 왼쪽에서 1번째 파트가 최하위 순서 이름입니다. (이와 반대로 로컬 주소는 "일반" 순서로 표현됩니다. 즉, 왼쪽에서 1번째 파트가 최상위 순서 이름입니다)예제:
#include "Location.hpp"
IO::Location loc ("lan://Server.Subnetwork/Share/Folder/File.ext");
- Location은 "전체 경로"(주소)의 파트들로부터 점진적으로 만들어가며 생성할 수 있습니다.
URL 스타일 솔루션과 마찬가지로 이 방법은 경로 delimiter 문자들의 차이점을 없애며 (서로 다른 OS를 가진) 모든 머신들이 동일하게 보는 네트워크 서버 상의 엔트리(예. 파일)에 접근해야 할 때 유용할 수 있습니다.
(예. 공유 이름은 모든 버신과 서브네트워크에서 동일함)
예를 들어, 만약 "File.ext"라는 파일이 "Folder"라는 폴더 안에 있고,
이 폴더는 "Share"라는 폴더 안에 있으며, 이 폴더는 "Server"라는 서버의 공유 이름입니다.
(Windows 표현식으로는 "//Server/Share/Folder/File.ext")
그러면 해당 위치는 다음과 같은 방식으로 만들어질 수 있습니다:
#include "Location.hpp"
IO::Location loc; // 기본 "비어 있는" 인스턴스 (로컬 루트를 참조함) loc.AppendToNetwork ("Server"); // 위치의 네트워크 주소에 appending loc.AppendToLocal ("Share"); // 위치의 로컬 주소에 appending loc.AppendToLocal ("Folder"); loc.AppendToLocal ("File.ext");
- 마침내 위치를 "전체 경로"(주소)의 현재 플랫폼의 네이티브 표현으로부터 생성할 수 있습니다.
예를 들면, FSSpec structure는 Macintosh의 네이티브 표현식입니다:
#include <Files.h> // 파일 처리를 위한 Macintosh 시스템 헤더 (FSSpec structure 포함) #include "Location.hpp"
FSSpec fsSpec = GetAnFSSpec (); // FSSpec를 어떻게 해서든 가져옴 IO::Location loc (fsSpec); // FSSpec로부터 직접 위치를 생성할 수 있음
이 솔루션은 당연히 플랫폼 종속적입니다.