코코아 응용 프로그램에서 사용중인 IO 미디어의 자연 블록 크기를 확인하고 싶습니다. 나는 "getPreferredBlockSize()"라고 불리는 IOMedia.cpp의 함수를 보았는데, 아마도이 블록 크기를 나에게 줄 것이다. 사람들이 제 앱에서이 함수를 사용하는 방법이나 기본 IO 미디어의 자연 블록 크기를 찾을 수있는 다른 방법이 있다면 설명해주십시오.파일 핸들에서 사용중인 미디어의 자연 블록 크기를 찾습니다.
감사
코코아 응용 프로그램에서 사용중인 IO 미디어의 자연 블록 크기를 확인하고 싶습니다. 나는 "getPreferredBlockSize()"라고 불리는 IOMedia.cpp의 함수를 보았는데, 아마도이 블록 크기를 나에게 줄 것이다. 사람들이 제 앱에서이 함수를 사용하는 방법이나 기본 IO 미디어의 자연 블록 크기를 찾을 수있는 다른 방법이 있다면 설명해주십시오.파일 핸들에서 사용중인 미디어의 자연 블록 크기를 찾습니다.
감사
당신은 파일 기술자와 합계 구조체를 받아 데이터의 구조체를 채우는 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 /영형. (작은 덩어리의 파일에 작성하는 것은 비효율적 인 읽기 - 수정 - 재 작성의 원인이 될 수 있습니다.)
여기 기본 블록 크기를 얻을 수있는 코드이다 :
#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
덕분에 내가이 있기 때문에이 검색되었습니다 mipadi을 장기. – King
네이티브 블록 크기가 아닙니다. 내 HD의 경우 약 13MB이지만 기본 블록 크기는 512kb입니다. –
나는 fstat (fd, & info)를 의미한다고 생각한다. 여기서 stat (fd, & info)를 조건부로 평가한다. – Travis