2009-08-07 3 views
0

코코아 응용 프로그램에서 사용중인 IO 미디어의 자연 블록 크기를 확인하고 싶습니다. 나는 "getPreferredBlockSize()"라고 불리는 IOMedia.cpp의 함수를 보았는데, 아마도이 블록 크기를 나에게 줄 것이다. 사람들이 제 앱에서이 함수를 사용하는 방법이나 기본 IO 미디어의 자연 블록 크기를 찾을 수있는 다른 방법이 있다면 설명해주십시오.파일 핸들에서 사용중인 미디어의 자연 블록 크기를 찾습니다.

감사

답변

1

당신은 파일 기술자와 합계 구조체를 받아 데이터의 구조체를 채우는 C libc 기능을 사용할 수 있습니다. 이 같은 코드 (경고 : 나는 자신이 테스트하지 않았다) : 일하는 것이

#include <sys/stat.h> 

/* ... */ 

struct stat info; 
blksize_t preferredBlockSize; 
int fd = [myFileHandle fileDescriptor]; 
if ((fstat(fd, &info)) == 0) { 
    preferredBlockSize = info.st_blksize; 
} else { 
    NSLog(@"Could not get file stats"); 
} 

/* Do what you want with preferredBlockSize */ 

fstat() 사람이 페이지에서 :

st_blksize 필드는 효율적인 파일 시스템에 대한 "선호"블록 크기를 제공 I /영형. (작은 덩어리의 파일에 작성하는 것은 비효율적 인 읽기 - 수정 - 재 작성의 원인이 될 수 있습니다.)

+0

덕분에 내가이 있기 때문에이 검색되었습니다 mipadi을 장기. – King

+0

네이티브 블록 크기가 아닙니다. 내 HD의 경우 약 13MB이지만 기본 블록 크기는 512kb입니다. –

+0

나는 fstat (fd, & info)를 의미한다고 생각한다. 여기서 stat (fd, & info)를 조건부로 평가한다. – Travis

1

여기 기본 블록 크기를 얻을 수있는 코드이다 :

#include <sys/stat.h> 
#include <IOKit/IOKitLib.h> 
#include <IOKit/IOBSD.h> 
#include <IOKit/storage/IOMedia.h> 
#include <CoreFoundation/CoreFoundation.h> 

// look up device number with stat 
struct stat stats; 
if (stat(path, &stats) != 0) { 
    return; 
} 
// use st_rdev instead of st_dev if 
// the path is a device (/dev/disk0) 
int bsd_major = major(stats.st_dev); 
int bsd_minor = minor(stats.st_dev); 

CFTypeRef keys[2] = { CFSTR(kIOBSDMajorKey), CFSTR(kIOBSDMinorKey) }; 
CFTypeRef values[2]; 
values[0] = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &bsd_major); 
values[1] = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &bsd_minor); 

CFDictionaryRef matchingDictionary; 
matchingDictionary = CFDictionaryCreate(kCFAllocatorDefault, 
             &keys, &values, 
             sizeof(keys)/sizeof(*keys), 
             &kCFTypeDictionaryKeyCallBacks, 
             &kCFTypeDictionaryValueCallBacks); 

CFRelease(values[0]); 
CFRelease(values[1]); 
// IOServiceGetMatchingService uses up one reference to the dictionary 
io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, 
                matchingDictionary); 

if (!service) { 
    return; 
} 
CFNumberRef blockSizeProperty; 
blockSizeProperty = (CFNumberRef)IORegistryEntryCreateCFProperty(service, 
             CFSTR(kIOMediaPreferredBlockSizeKey), 
             kCFAllocatorDefault, 0); 
if (!blockSizeProperty) { 
    return; 
} 

int blockSize; 
CFNumberGetValue(blockSizeProperty, kCFNumberIntType, &blockSize); 
CFRelease(blockSizeProperty); 

// blockSize is the native block size of the device 
관련 문제