2010-04-10 2 views
0

외부 DLL에서 파일 핸들을 가져 와서 FileStream을 인스턴스화한다고합시다. 읽기와 쓰기에 잘 작동합니다.핸들 생성자를 사용하는 FileStream에서 Name 속성이 <Unknown> 인 이유는 무엇입니까?

그런 다음 핸들의 경로와 이름을 지정하고 FileStream 객체의 Name 속성에 액세스하려고하면 '알 수 없음'이 반환됩니다.

이 파일을 취하는 생성자 마찬가지입니다 핸들 :이 구현되지 있기 때문에

public FileStream(IntPtr handle, ... 
public FileStream(SafeFileHandle handle, ... 

나는 짧은 답을 알고있다. 개인 필드 _fileNameFileStream 인 경우 해당 생성자에는 할당되지 않습니다.

핸들에서 이름을 얻으려면 API이 하나 이상의 코드 행을 포함하는 것으로 보입니다. 그러나 나는 여전히이 코드가 포함될 수 있다고 생각합니다.

진짜 질문은 다음과 같습니다. 왜 그런가? 아니면 그냥 잊었 니?

답변

1

파일 핸들과 관련된 파일 이름을 얻는 방법에 대한 문서화 된 방법이 없습니다. 연결된 예제는 메모리 매핑 된 파일에서만 작동하며 GetMappedFileName() API 함수를 사용합니다. 일반 API 핸들을위한 API는 없습니다.

SysInternals 'Handle 유틸리티가 실제로 가능합니다. 문서화되지 않은 이유는 커널 핸들 테이블의 구조가 매우 다양하기 때문에 모든 Windows 버전에서 변경되었습니다. 그리고 가장 중요한 이유는 파일 시스템 무결성을 파괴하는 파일 핸들에서 매우 안전하지 않은 작업을 허용하기 때문입니다. 사람들은 파일 잠금 문제를 없애기 위해 다른 프로세스가 소유 한 파일 핸들을 닫는 데이 파일을 사용할 것입니다.

NtQuerySystemInformation을 검색하여이를 수행하는 방법을 알 수 있습니다. 하드 드라이브 사용을 염두에두면 하드 드라이브를 매일 백업하십시오.

+0

@nubugz, 설명 주셔서 감사합니다 :) 핸들에 mmf를 생성하고보기를 가져온 다음 파일 이름/경로를 얻기 위해 GetMappedFileName 호출을 사용하여 링크 된 코드가 모든 파일에서 작동해야합니다. . 대단히 많은 작업이 필요하며 외장에서 보이는 것은 간단한 OS 호출이어야하는 것처럼 보이는 불필요한 작업입니다. 이상한 그것은 mmf에 관해서 만 구현됩니다. 그러나 다시, 우리는 종종 핸들에서 이름으로 매핑하는 옵션이 필요하지 않을 수도 있습니다. –

+0

흠, 두 번째 생각에, 당신 말이 맞습니다. 원격 서버의 공유 폴더에있는 파일에 대한 핸들을 사용하여 필자와 공유하십시오. 그리고 접근 권한이 중요합니다. Anyhoo, .NET 팀이 지금까지 생각한 것은 아무것도 없습니다. –

+0

나는 그들도 의심 스럽다. 우리는 언젠가 mmf 외에도 OS 호출을 볼 것입니다. 그리고 나는 원격 파일에 대한 핸들이 조금이라도 보인다는 것에 동의한다. mmf 호출은 공유 상태로 파일을 열지 않으면 액세스 할 수 없기 때문에 문제가 발생합니다. –