আইফোন / আইপ্যাড ডিভাইসে মোট উপলব্ধ / ফ্রি ডিস্কের স্থান কীভাবে সনাক্ত করবেন?


147

আমি আইফোন / আইপ্যাড ডিভাইসে প্রোগ্রামযোগ্যভাবে উপলব্ধ / বিনামূল্যে ডিস্কের স্থান সনাক্ত করার আরও ভাল উপায় খুঁজছি।
বর্তমানে আমি ডিস্কের স্থান সনাক্ত করতে এনএসফিলম্যানেজারটি ব্যবহার করছি। নিম্নলিখিত কোডটির স্নিপেট যা আমার জন্য কাজ করে:

-(unsigned)getFreeDiskspacePrivate {
NSDictionary *atDict = [[NSFileManager defaultManager] attributesOfFileSystemForPath:@"/" error:NULL];
unsigned freeSpace = [[atDict objectForKey:NSFileSystemFreeSize] unsignedIntValue];
NSLog(@"%s - Free Diskspace: %u bytes - %u MiB", __PRETTY_FUNCTION__, freeSpace, (freeSpace/1024)/1024);

return freeSpace;
}


আমি কি উপরের স্নিপেট দিয়ে ঠিক করছি? বা মোট উপলব্ধ / ফ্রি ডিস্ক স্পেস জানার আরও ভাল কোনও উপায় আছে।
লো মোট ডিস্ক স্পেস দৃশ্যে সিঙ্ক সম্পাদন করতে আমাদের অ্যাপ্লিকেশনটিকে আমাদের আটকাতে হওয়ায় আমি মোট ফ্রি ডিস্ক স্পেস সনাক্ত করতে পেরেছি।


আমি আশা করি
স্ট্যাকওভারফ্লো

1
দেখে মনে হচ্ছে যে তিনি তার প্রশ্নের মধ্যে যে কোডটি ব্যবহার করছেন সেটি আপনার দেওয়া লিঙ্কের কোডের চেয়ে ভাল (তিনি "/" এর অধীনে সমস্ত উপ-ডিরেক্টরিগুলি
ট্র্যাভার করার

লিঙ্কের জন্য ধন্যবাদ মিখাইল তবে আমি কেবলমাত্র একটি নির্দিষ্ট ফোল্ডার নয়, আইফোন / আইপ্যাড ডিভাইসে মোট উপলব্ধ / বিনামূল্যে ডিস্কের স্থান অনুসন্ধান করছি। উদাহরণস্বরূপ, 32 গিগাবাইট আইফোনটিতে, যদি মোট উপলব্ধ / ফ্রি মাপ 28GB হয়, তবে আমি সেই প্রোগ্রামটিগতভাবে সনাক্ত করতে সক্ষম হব।
কোড.ওয়ারিওর

আমি আশা করি এই লিঙ্কটি সাহায্য করবে: jaypraकाशdubey.blogspot.in/2014/07/…
জয়প্রকাশ দুবে

উত্তর:


152

আপডেট : যেহেতু এই উত্তরটির পরে প্রচুর সময় অতিবাহিত হয়েছে এবং নতুন পদ্ধতি / এপিআই যুক্ত করা হয়েছে, দয়া করে সুইফট ইত্যাদির জন্য নীচের আপডেট হওয়া উত্তরগুলি দেখুন; যেহেতু আমি সেগুলি নিজে ব্যবহার করি নি, তাই আমি তাদের পক্ষে কোনও প্রতিশ্রুতি দিতে পারি না।

আসল উত্তর : আমি নিম্নলিখিত সমাধানগুলি আমার জন্য কাজ করে দেখলাম:

-(uint64_t)getFreeDiskspace {
    uint64_t totalSpace = 0;
    uint64_t totalFreeSpace = 0;
    NSError *error = nil;  
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    NSDictionary *dictionary = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error: &error];  

    if (dictionary) {  
        NSNumber *fileSystemSizeInBytes = [dictionary objectForKey: NSFileSystemSize];  
        NSNumber *freeFileSystemSizeInBytes = [dictionary objectForKey:NSFileSystemFreeSize];
        totalSpace = [fileSystemSizeInBytes unsignedLongLongValue];
        totalFreeSpace = [freeFileSystemSizeInBytes unsignedLongLongValue];
        NSLog(@"Memory Capacity of %llu MiB with %llu MiB Free memory available.", ((totalSpace/1024ll)/1024ll), ((totalFreeSpace/1024ll)/1024ll));
    } else {  
        NSLog(@"Error Obtaining System Memory Info: Domain = %@, Code = %ld", [error domain], (long)[error code]);
    }  

    return totalFreeSpace;
}

এটি ডিভাইস মেশিনের সাথে সংযুক্ত থাকাকালীন আইটিউনস প্রদর্শিত হুবহু আকার দেয়।


4
একটি ফ্লোটে রূপান্তর করা প্রায় 2GB এর উপরে ভুল ফলাফল দিতে পারে। আপনার যদি সত্যিই বড় ফাইল আকারের সাথে ডিল করতে হয় তবে তার পরিবর্তে একটি ডাবল বা দীর্ঘ ডাবল ব্যবহার করুন।
অ্যাশ

অ্যাশ দ্বারা নির্দেশিত হিসাবে, এই পদ্ধতিটির একটি ভুল ফলাফল রয়েছে। আমার আইপ্যাড 2-তে, 64 জিবি সহ এটি +0.25 গিগাবাইট দ্বারা ব্যর্থ হয় ... ডেভিড এইচ পোস্ট করেছেন নীচের পদ্ধতিটিতে uint64_t ভার্স ব্যবহার করার সময় সঠিক ফলাফল পাওয়া যায়।
লেয়ানড্রো আলভেস

3
নীচে দেখানো হিসাবে @ ডেভিড এইচ থেকে পরামর্শ প্রতিবিম্বিত করতে কোড স্নিপেট সম্পাদনা করা হয়েছে।
Code.Warrior

4
+200 এমবি কোনও সমস্যা নয়। সেটিংসে আমার কাছে "0 বাইট" উপলভ্য স্থান রয়েছে। এবং আমি যখন আমার অ্যাপ্লিকেশনটি প্রবেশ করি এবং ব্যবহার করি তখন এই পদ্ধতিটি 150 এমবি ফাঁকা স্থানের প্রতিবেদন করে। তারপরে আমি এই অবশিষ্ট স্থানটি পূরণ করব এবং কেবল তখনই অ্যাপটি ক্র্যাশ হয়ে যাবে। সুতরাং আমি বলব যে এই পদ্ধতিটি আপনাকে সেটিংসে যা দেখছে তার চেয়ে আরও সঠিক তথ্য দেয়।
আনজাজিক

4
কেন স্টাফের NSUIntegerপরিবর্তে কেউ ব্যবহার করছে না uint64_t? আমরা ওবজ-সি লিখছি, সি ++ বা সি নয় এনএসইউইন্টেজার আপনাকে এখনই একটি স্বাক্ষরযুক্ত bit৪ বিট পূর্ণসংখ্যা দেবে, তবে জিনিসগুলি পরিবর্তনের সাথে সাথে ঘটতে থাকলে আমি কল্পনা করি যে অ্যাপল সেই ম্যাক্রো আপডেট করবে (আসুন এক পর্যায়ে 128 বিট বলি, আসল হয়ে যায়)
গোলস

59

স্বাক্ষরবিহীন দীর্ঘ দীর্ঘ ব্যবহার করে সংশোধিত উত্স:

- (uint64_t)freeDiskspace
{
    uint64_t totalSpace = 0;
    uint64_t totalFreeSpace = 0;

    __autoreleasing NSError *error = nil;  
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    NSDictionary *dictionary = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error: &error];  

    if (dictionary) {  
        NSNumber *fileSystemSizeInBytes = [dictionary objectForKey: NSFileSystemSize];  
        NSNumber *freeFileSystemSizeInBytes = [dictionary objectForKey:NSFileSystemFreeSize];
        totalSpace = [fileSystemSizeInBytes unsignedLongLongValue];
        totalFreeSpace = [freeFileSystemSizeInBytes unsignedLongLongValue];
        NSLog(@"Memory Capacity of %llu MiB with %llu MiB Free memory available.", ((totalSpace/1024ll)/1024ll), ((totalFreeSpace/1024ll)/1024ll));
    } else {  
        NSLog(@"Error Obtaining System Memory Info: Domain = %@, Code = %d", [error domain], [error code]);  
    }  

    return totalFreeSpace;
}

সম্পাদনা: দেখে মনে হচ্ছে যে কেউ 'স্বাক্ষরবিহীন দীর্ঘ দীর্ঘ' পরিবর্তে 'uint64_t' ব্যবহার করার জন্য এই কোডটি সম্পাদনা করেছে। অদূর ভবিষ্যতে এটি ঠিক হওয়া উচিত, তারা একই নয়। 'uint64_t' 64৪ বিট এবং সর্বদা তা হবে। 10 বছরে 'স্বাক্ষরবিহীন দীর্ঘ দীর্ঘ' 128 হতে পারে its এটি একটি ছোট বিষয় তবে কেন আমি স্বাক্ষরবিহীন লংলং ব্যবহার করেছি।


নতুন অটোমেটিক কাউন্টিং সিস্টেমের সাথে আমার অভিজ্ঞতা নেই তবে __autoreleasing কী? আপনার সাধারণত এনএসিররর ফেরত স্বতঃস্ফালিত হওয়ার দরকার নেই
শ্রদ্ধেয়


3
আমার আইপড টাচ চতুর্থ জেনার উপর আইওএস 5.1 চলছে, এনএসফাইলসিসট্রিফ্রি সাইজ এখনও 200 মিলিয়ন এমবিাইট প্রতিবেদন করছে। আমি ডিবাগারে পুরো এনএসডি অভিধানের বিষয়বস্তু প্রিন্ট আউট করছি ... এনএসফাইসিসটেমসাইজ ঠিক আছে ... কারও কাছে এই সমস্যার সমাধান আছে কি?
Zennichimaro

@ জেনিচিমারো: আপনি কি নিজের সমস্যা সমাধান করেছেন? আমি আইপ্যাডে ফাঁকা স্থান পরীক্ষা করে নিলে 0.2 গিগাবাইট অতিরিক্ত পেয়েও আমি একই সমস্যার মুখোমুখি। আইপ্যাড 24.1 গিগাবাইট উপলব্ধ স্পেস দেখায় তবে কোডে এটি 24.3 জিবি দেখাচ্ছে।
সুধীর কুমার পালচুরি

1
@ ডিজেমন আপনি এই ধরণের একটি পূর্ণসংখ্যার আকারের জন্য এনএসএনবারকে জিজ্ঞাসা করতে পারবেন না। এই কারণেই এই জাতীয় জিনিসগুলির জন্য আমি পরিচিত বিট আকারের একক পছন্দ করি। প্রযুক্তিগতভাবে আমি আপনার বক্তব্যের সাথে একমত হওয়ার পরেও, এনএসআইন্টার এবং ফর্ম্যাট স্ট্রিংগুলি ব্যবহার করার জন্য আমার ইতিমধ্যে যথেষ্ট সতর্কতা রয়েছে! আমার জীবদ্দশায় এবং আপনার পক্ষে 64 বিটগুলি যথেষ্ট বিট হবে।
ডেভিড এইচ

34

আমি একটি ক্লাস লিখেছি / সুইফট ব্যবহার করে ব্যবহারযোগ্য মেমরি পেতে। ডেমো এ: https://github.com/thanhcuong1990/swift-disk-status
সুইফট 4 আপডেট হয়েছে।

import UIKit

class DiskStatus {

    //MARK: Formatter MB only
    class func MBFormatter(_ bytes: Int64) -> String {
        let formatter = ByteCountFormatter()
        formatter.allowedUnits = ByteCountFormatter.Units.useMB
        formatter.countStyle = ByteCountFormatter.CountStyle.decimal
        formatter.includesUnit = false
        return formatter.string(fromByteCount: bytes) as String
    }


    //MARK: Get String Value
    class var totalDiskSpace:String {
        get {
            return ByteCountFormatter.string(fromByteCount: totalDiskSpaceInBytes, countStyle: ByteCountFormatter.CountStyle.file)
        }
    }

    class var freeDiskSpace:String {
        get {
            return ByteCountFormatter.string(fromByteCount: freeDiskSpaceInBytes, countStyle: ByteCountFormatter.CountStyle.file)
        }
    }

    class var usedDiskSpace:String {
        get {
            return ByteCountFormatter.string(fromByteCount: usedDiskSpaceInBytes, countStyle: ByteCountFormatter.CountStyle.file)
        }
    }


    //MARK: Get raw value
    class var totalDiskSpaceInBytes:Int64 {
        get {
            do {
                let systemAttributes = try FileManager.default.attributesOfFileSystem(forPath: NSHomeDirectory() as String)
                let space = (systemAttributes[FileAttributeKey.systemSize] as? NSNumber)?.int64Value
                return space!
            } catch {
                return 0
            }
        }
    }

    class var freeDiskSpaceInBytes:Int64 {
        get {
            do {
                let systemAttributes = try FileManager.default.attributesOfFileSystem(forPath: NSHomeDirectory() as String)
                let freeSpace = (systemAttributes[FileAttributeKey.systemFreeSize] as? NSNumber)?.int64Value
                return freeSpace!
            } catch {
                return 0
            }
        }
    }

    class var usedDiskSpaceInBytes:Int64 {
        get {
            let usedSpace = totalDiskSpaceInBytes - freeDiskSpaceInBytes
            return usedSpace
        }
    }

}

ডেমো

সুইফট দিয়ে ডিস্ক স্পেসের স্থিতি পান


এমবিফর্মেটরটি কেন আছে আপনার কোনও ধারণা আছে? এটি কোথাও ব্যবহৃত হয় না।
বেন সিনক্লেয়ার

যে কোনও মানকে এমবি মান রূপান্তর করার জন্য এমবিফর্ম্যাটর একটি ফাংশন। আমি এটি ডেমো প্রকল্পের জন্য ব্যবহার করছি না। তবে আমার দরকার অন্য প্রকল্পের জন্য।
কুওন লাম

1
ফাইল ম্যানেজার এক্সটেনশনে এটি দুর্দান্ত।
লিওন

2
আইটিউনস 18.99 গিগাবাইট বিনামূল্যে দেখায় তবে আমি বর্ণিত পদ্ধতিগুলি ব্যবহার করার সময় 13.41 জিবি পাই get কেউ কি জানে আমি কী মিস করছি?
ভিটালি বুয়্যারস্কি

1
@ কুংলাম আনারপিংয়ের ত্রুটিগুলি নিক্ষেপ করা হয় না এবং করায় / ধরা পড়ে না। ত্রুটিগুলি সঠিকভাবে পরিচালনা করতে নমুনা উত্স কোডটি লেখা উচিত। stackoverflow.com/questions/34628999/...
SafeFastExpressive

26

আপনার যদি আকারের সাথে ফর্ম্যাট স্ট্রিংয়ের প্রয়োজন হয় তবে আপনি গিটহাবের সুন্দর লাইব্রেরিটি একবার দেখে নিতে পারেন :

#define MB (1024*1024)
#define GB (MB*1024)

@implementation ALDisk

#pragma mark - Formatter

+ (NSString *)memoryFormatter:(long long)diskSpace {
    NSString *formatted;
    double bytes = 1.0 * diskSpace;
    double megabytes = bytes / MB;
    double gigabytes = bytes / GB;
    if (gigabytes >= 1.0)
        formatted = [NSString stringWithFormat:@"%.2f GB", gigabytes];
    else if (megabytes >= 1.0)
        formatted = [NSString stringWithFormat:@"%.2f MB", megabytes];
    else
        formatted = [NSString stringWithFormat:@"%.2f bytes", bytes];

    return formatted;
}

#pragma mark - Methods

+ (NSString *)totalDiskSpace {
    long long space = [[[[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil] objectForKey:NSFileSystemSize] longLongValue];
    return [self memoryFormatter:space];
}

+ (NSString *)freeDiskSpace {
    long long freeSpace = [[[[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil] objectForKey:NSFileSystemFreeSize] longLongValue];
    return [self memoryFormatter:freeSpace];
}

+ (NSString *)usedDiskSpace {
    return [self memoryFormatter:[self usedDiskSpaceInBytes]];
}

+ (CGFloat)totalDiskSpaceInBytes {
    long long space = [[[[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil] objectForKey:NSFileSystemSize] longLongValue];
    return space;
}

+ (CGFloat)freeDiskSpaceInBytes {
    long long freeSpace = [[[[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil] objectForKey:NSFileSystemFreeSize] longLongValue];
    return freeSpace;
}

+ (CGFloat)usedDiskSpaceInBytes {
    long long usedSpace = [self totalDiskSpaceInBytes] - [self freeDiskSpaceInBytes];
    return usedSpace;
}


এই এখনও একই + + 200MB বাগ প্রবণ stackoverflow.com/questions/9270027/...
Paulius Liekis

13

'স্বাক্ষরবিহীন' ব্যবহার করবেন না, এটি কেবল 32 বিট যা 4 জিবিতে প্রবাহিত হবে যা সাধারণত আইপ্যাড / আইফোন ফ্রি স্পেসের চেয়ে কম is স্বাক্ষরবিহীন দীর্ঘ দীর্ঘ (বা uint64_t) ব্যবহার করুন এবং এনএসএনবারের থেকে 64-বিট ইন্ট হিসাবে স্বাক্ষরযুক্ত লংলংভ্যালু ব্যবহার করে মানটি পুনরুদ্ধার করুন।


3
এটি একটি টিপ-এর চেয়ে ভাল - "ইট দ্য ল" :-) তিনি যেমন বলেছিলেন, মূল কোডটি কেবল সাধারণ ভুল।
ডেভিড এইচ

13

আপনার যদি খালি সুইফট ব্যবহার করে বাকী ফাঁকা জায়গাটি পাওয়া যায় তবে এটি কিছুটা আলাদা। অফলিস্টেম্যাটপ্যাথ () এর পরিবর্তে আপনাকে অ্যাট্রিবিউসফাইসিসটেমফোরপথ () ব্যবহার করতে হবে:

func deviceRemainingFreeSpaceInBytes() -> Int64? {
    let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    var attributes: [String: AnyObject]
    do {
        attributes = try NSFileManager.defaultManager().attributesOfFileSystemForPath(documentDirectoryPath.last! as String)
        let freeSize = attributes[NSFileSystemFreeSize] as? NSNumber
        if (freeSize != nil) {
            return freeSize?.longLongValue
        } else {
            return nil
        }
    } catch {
        return nil
    }
}

সম্পাদনা: সুইফ্ট ১.০
সম্পাদনা 2 এর জন্য আপডেট হয়েছে: মার্টিন আর এর উত্তর ব্যবহার করে সুরক্ষার জন্য আপডেট হয়েছে ।
3 সম্পাদনা করুন: সুইফট 2.0 এর জন্য আপডেট হয়েছে ( ডিজেল দ্বারা )


আমি এই উত্তরটি ব্যবহার করার চেষ্টা করছিলাম, তবে এটি GM ([NSObject: AnyObject] এর অধীন সংকলন করবে না? 'সাবস্ক্রিপ্ট' নামে সদস্য নেই)। আমি মনে করি এটি এখানে উত্থাপিত সমস্যার কারণে হয়েছে তবে কীভাবে এই উত্তরটিকে এই প্রসঙ্গে কাজ করা যায় তা আমি বুঝতে পারি না। যে কোনও সহায়তা প্রশংসিত
ব্রায়ান হ্যানসন

আমি এখনই সুইফ্ট ১.০ এ কাজ করার উত্তর আপডেট করেছি। কারণ অফলিস্টিস্টিফর্মপথ বৈশিষ্ট্যগুলি [এনএসওজেক্ট: যেকোনওজেক্ট] ফেরত দেয়? আপনার এনএসডিকোরিয়ায় কাস্ট করা দরকার? যেহেতু এটি শূন্য হতে পারে এবং তারপরে সাবস্ক্রিপ্ট করার জন্য অভিধানটি মোড়ক করুন। (এটি কিছুটা অনিরাপদ, সুতরাং সময়
পেলে

আপডেটের জন্য ধন্যবাদ. দেখা যাচ্ছে যে, আপনার জবাবের প্রায় এক ঘন্টা আগে আমি এগিয়ে গিয়ে এখানে একটি নতুন প্রশ্ন হিসাবে বিষয়টি প্রণয়ন করেছি । এখানে এখন একটি উত্তর আছে, তবে বিকল্পগুলির সাথে সম্পর্কিত পদ্ধতিটি যেহেতু আমার কাছে কিছুটা অস্বচ্ছ, তাই আমি আপনার সুবিধার্থে অন্য একটি পদ্ধতি দেখতে পছন্দ করব। তোমার বোন রাহেলকে আমার শুভেচ্ছা জানাও।
ব্রায়ান হ্যানসন

ব্রায়ান, আমি আপনার উত্তর দেওয়া প্রশ্নের প্রথম উত্তরটি পরামর্শ দেব কারণ এটি সুরক্ষা এবং স্বচ্ছতার একটি ভাল মিশ্রণ। আমি নিশ্চিত না যে আমি তার পরে আরও একটি ভাল উত্তর দিতে পারব। বিকল্পগুলি প্রথমে একটি বিভ্রান্তিকর হতে পারে, আমি দৃ strongly ়ভাবে বিকল্পগুলির উপর সুইফট ম্যানুয়াল বিভাগটি পড়ার পরামর্শ দিচ্ছি এটি বেশ ভাল।
রুবেনস্যান্ডউইচ

অনেক প্রশংসা করা হয়েছে, আমি সেই ম্যানুয়ালটি আবার দেখব এবং ভাল এসও প্রশ্নও পেয়েছি। ব্রায়ান
ব্রায়ান হ্যানসন

9

এখানে আমার উত্তর এবং কেন এটি ভাল।

উত্তর (সুইফট):

func remainingDiskSpaceOnThisDevice() -> String {
    var remainingSpace = NSLocalizedString("Unknown", comment: "The remaining free disk space on this device is unknown.")
    if let attributes = try? FileManager.default.attributesOfFileSystem(forPath: NSHomeDirectory()),
        let freeSpaceSize = attributes[FileAttributeKey.systemFreeSize] as? Int64 {
        remainingSpace = ByteCountFormatter.string(fromByteCount: freeSpaceSize, countStyle: .file)
    }
    return remainingSpace
}

উত্তর (উদ্দেশ্য-সি):

- (NSString *)calculateRemainingDiskSpaceOnThisDevice
{
    NSString *remainingSpace = NSLocalizedString(@"Unknown", @"The remaining free disk space on this device is unknown.");
    NSDictionary *dictionary = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil];
    if (dictionary) {
        long long freeSpaceSize = [[dictionary objectForKey:NSFileSystemFreeSize] longLongValue];
        remainingSpace = [NSByteCountFormatter stringFromByteCount:freeSpaceSize countStyle:NSByteCountFormatterCountStyleFile];
    }
    return remainingSpace;
}

কেন এটি ভাল:

  • লাইব্রেরিতে কোকো তৈরির ব্যবহার করে NSByteCountFormatter , যার অর্থ বাইট থেকে গিগাবাইটে কোনও পাগল ম্যানুয়াল গণনা নেই। আপেল আপনার জন্য এটি করে!
  • সহজেই অনুবাদযোগ্য: NSByteCountFormatterএটি আপনার জন্য করে। উদাহরণস্বরূপ, যখন ডিভাইসের ভাষা ইংরাজীতে সেট করা থাকে তখন স্ট্রিংটি 248.8 এমবি পড়বে তবে ফরাসী সেট করা থাকলে 248,8 মোটি পড়বে, অন্য ভাষার জন্য সিটিআর।
  • একটি ত্রুটির ক্ষেত্রে একটি ডিফল্ট মান দেওয়া হয়।

1
@ জুয়ানবোয়েরো সুইফটে পোস্ট হয়েছে ৩.১ (শেষ অবধি)!
ক্রিসজেএফ

7

গুরুত্বপূর্ণ স্পষ্টতা (আমার পক্ষে কমপক্ষে)। আমি যদি আমার আইপডটিকে আমার ম্যাকের সাথে সংযুক্ত করি তবে এটি আইটিউনস অ্যাপ দ্বারা প্রদর্শিত তথ্য।

আইটিউনস অ্যাপ থেকে আইপড মেমরি সম্পর্কিত তথ্য informa

আমি যখন উপরের কোডটি ব্যবহার করি:

long long freeSpace = [[[[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil]
                            objectForKey:NSFileSystemFreeSize] longLongValue];

NSString *free1 = [NSByteCountFormatter stringFromByteCount:freeSpace countStyle:NSByteCountFormatterCountStyleFile];

[label1 setText:free1];

NSString *free2 = [NSByteCountFormatter stringFromByteCount:freeSpace countStyle:NSByteCountFormatterCountStyleBinary];

[label2 setText:free2];

কাউন্টস্টাইল এনএসবাইটকাউন্টফর্ম্যাটরমাউন্টসাইল ফাইলে আমাকে দেখায়: 17,41 জিবি

কাউন্টস্টাইল এনএসবাইটকাউন্টফর্ম্যাটরআউটসিল্টাইনারি আমাকে দেখান: 16,22 গিগাবাইট

১,,২২ গিগাবাইট ( এনএসবাইটকাউন্টফর্ম্যাটরঅ্যাক্টসাইটিস্টাইনারি ) আমি আইপডটি আমার ম্যাকের সাথে সংযুক্ত করার সময় আইটিউনস অ্যাপ আমাকে যে সংখ্যাটি প্রদর্শন করে তা হ'ল ঠিক


ফাইল কেবল ম্যাক ফাইলের জন্য এবং আইওএসের জন্য নয়?
জোও নুনস

এটি একই পরিমাণে বাইট 1000 (গিগাবাইট তারপর এমবি তারপর গিগাবাইট) বনাম
1024.

7

আইওএস 11 এ উপলব্ধ ডিস্কে উপলব্ধ আকার পেতে একটি নতুন সঠিক API সহ আপডেট করুন। নতুন এপিআই রিসোর্স কীটির বিবরণ এখানে রয়েছে:

#if os(OSX) || os(iOS)
/// Total available capacity in bytes for "Important" resources, including space expected to be cleared by purging non-essential and cached resources. "Important" means something that the user or application clearly expects to be present on the local system, but is ultimately replaceable. This would include items that the user has explicitly requested via the UI, and resources that an application requires in order to provide functionality.
/// Examples: A video that the user has explicitly requested to watch but has not yet finished watching or an audio file that the user has requested to download.
/// This value should not be used in determining if there is room for an irreplaceable resource. In the case of irreplaceable resources, always attempt to save the resource regardless of available capacity and handle failure as gracefully as possible.
@available(OSX 10.13, iOS 11.0, *) @available(tvOS, unavailable) @available(watchOS, unavailable)
public var volumeAvailableCapacityFor Usage: Int64? { return _get(.volumeAvailableCapacityForImportantUsageKey) }
#endif

আমি কী " ফাইলঅ্যাট্রিবিউটকিজে.সিস্টেমফ্রি সাইজ " এবং কী " ইউআরএল রিসোর্সকি.ভলিউমঅভিলিভেনসিভিলিটিস্পোসেস্পোর্টস ইউজেজকি " থেকে ফলাফলগুলি তুলনা করেছি এবং ফলাফলগুলি ফিরে পেয়েছি ফর্মটি " ভলিউমঅ্যাভিলিভ্যাসিপেইলিটিফর্ম্পিয়রটুকু ইউজেজেকে " ইউআই-তে প্রদর্শিত উপলব্ধ স্টোরেজটির সাথে মেলে। উপলব্ধ বিনামূল্যে ডিস্ক স্পেস তুলনা এই দ্রুত বাস্তবায়ন:

class var freeDiskSpaceInBytesImportant:Int64 {
    get {
        do {
            return try URL(fileURLWithPath: NSHomeDirectory() as String).resourceValues(forKeys: [URLResourceKey.volumeAvailableCapacityForImportantUsageKey]).volumeAvailableCapacityForImportantUsage!
        } catch {
            return 0
        }
    }
}

আপনার স্ক্রিনশট থেকে "সুবিধাবাদী ব্যবহার" কোথা থেকে আসছে?
rshev

এটি পেয়েছি volumeAvailableCapacityForOpportunisticUsageKey,।
rshev

হ্যাঁ রিশেভ, ভলিউমআলভ্য উপলব্ধতার ক্ষমতাপ্রাপ্তিবাদী ইউজেজকি আমার স্ক্রিনশটে "" সুবিধাবাদী ব্যবহার "
পেয়েছে

উপলব্ধ স্টোরেজ আকারটি দেখতে আমার জিজ্ঞাসা করা উচিত NSHomeDirectory()বা এর সাথে NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)। এই দুটি ব্যবহার করে কি কোনও পার্থক্য রয়েছে?
সূর্যকান্ত শর্মা

7

আপনি সুইফট 4 এবং ব্যবহার করে একটি অন্য সমাধান খুঁজে পেতে পারেনextension যা আপনি একটি ভাল বিকল্প দেয়।

এখানে UIDeviceএক্সটেনশন।

extension UIDevice {

    func totalDiskSpaceInBytes() -> Int64 {
        do {
            guard let totalDiskSpaceInBytes = try FileManager.default.attributesOfFileSystem(forPath: NSHomeDirectory())[FileAttributeKey.systemSize] as? Int64 else {
                return 0
            }
            return totalDiskSpaceInBytes
        } catch {
            return 0
        }
    }

    func freeDiskSpaceInBytes() -> Int64 {
        do {
            guard let totalDiskSpaceInBytes = try FileManager.default.attributesOfFileSystem(forPath: NSHomeDirectory())[FileAttributeKey.systemFreeSize] as? Int64 else {
                return 0 
            }
            return totalDiskSpaceInBytes
        } catch {
            return 0
        }
    }

    func usedDiskSpaceInBytes() -> Int64 {
        return totalDiskSpaceInBytes() - freeDiskSpaceInBytes()
    }

    func totalDiskSpace() -> String {
        let diskSpaceInBytes = totalDiskSpaceInBytes()
        if diskSpaceInBytes > 0 {
            return ByteCountFormatter.string(fromByteCount: diskSpaceInBytes, countStyle: ByteCountFormatter.CountStyle.binary)
        }
        return "The total disk space on this device is unknown"
    }

    func freeDiskSpace() -> String {
        let freeSpaceInBytes = freeDiskSpaceInBytes()
        if freeSpaceInBytes > 0 {
            return ByteCountFormatter.string(fromByteCount: freeSpaceInBytes, countStyle: ByteCountFormatter.CountStyle.binary)
        }
        return "The free disk space on this device is unknown"
    }

    func usedDiskSpace() -> String {
        let usedSpaceInBytes = totalDiskSpaceInBytes() - freeDiskSpaceInBytes()
        if usedSpaceInBytes > 0 {
            return ByteCountFormatter.string(fromByteCount: usedSpaceInBytes, countStyle: ByteCountFormatter.CountStyle.binary)
        }
        return "The used disk space on this device is unknown"
    }

}

এবং নমুনা ব্যবহার:

UIDevice.current.totalDiskSpaceInBytes()
UIDevice.current.totalDiskSpace()
UIDevice.current.freeDiskSpaceInBytes()
UIDevice.current.freeDiskSpace()
UIDevice.current.usedDiskSpaceInBytes()
UIDevice.current.usedDiskSpace()

!পরিবর্তে guardনিরাপদে typecastingবা nilচেক করতে একটি রাখুন ব্যবহার করবেন না ।
দি টাইগার

আপনার মন্তব্যের জন্য ধন্যবাদ @ দি টাইগার।
আবদুল্লাহসেলেক

3

আইওএস> = 6.0 এর জন্য আপনি নতুনটি ব্যবহার করতে পারেন NSByteCountFormatter। এই কোডটি বিন্যাসিত স্ট্রিং হিসাবে থাকা ফ্রি বাইটের সংখ্যা পায়।

NSError *error = nil;
NSArray * const paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSDictionary * const pathAttributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths firstObject] error:&error];
NSAssert(pathAttributes, @"");
NSNumber * const fileSystemSizeInBytes = [pathAttributes objectForKey: NSFileSystemFreeSize];
const long long numberOfBytesRemaining = [fileSystemSizeInBytes longLongValue];
NSByteCountFormatter *byteCountFormatter = [[NSByteCountFormatter alloc] init];
NSString *formattedNmberOfBytesRemaining = [byteCountFormatter stringFromByteCount:numberOfBytesRemaining];

2

নিম্নলিখিত কোডটি ক্রিসজেএফ দ্বারা সরবরাহিত উত্তরটির সুইফট 3.0 সংস্করণ বাস্তবায়ন:

func freeSpaceInBytes() -> NSString {

    var remainingSpace = NSLocalizedString("Unknown", comment: "The remaining free disk space on this device is unknown.")

    do {
        let dictionary =  try FileManager.default.attributesOfFileSystem(forPath: NSHomeDirectory())
        let freeSpaceSize = ((dictionary[FileAttributeKey.systemFreeSize] as AnyObject).longLongValue)!
        remainingSpace = ByteCountFormatter.string(fromByteCount: freeSpaceSize, countStyle: ByteCountFormatter.CountStyle.file)
    }
    catch let error {
        NSLog(error.localizedDescription)
    }

    return remainingSpace as NSString

}

আইফোনটির উপলব্ধ ডিস্কের স্থান সম্পর্কিত তথ্য কেন এটি আরও ফিরে আসবে। যখন আইফোনসের সেটআপ মেনুতে 998MB বলছে, এটি 1.2 গিগাবাইট প্রত্যাবর্তন করবে
আশা করি

1

ইউআইডিভাইস এক্সটেনশন হিসাবে সুইফ্টের জন্য

extension UIDevice {
    func freeDiskspace() -> NSString {
        let failedResult: String = "Error Obtaining System Memory"
        guard let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last else {
            return failedResult
        }
        do {
            let dictionary = try NSFileManager.defaultManager().attributesOfFileSystemForPath(path)
            if let fileSystemSizeInBytes = dictionary[NSFileSystemSize] as? UInt,
                let freeFileSystemSizeInBytes =     dictionary[NSFileSystemFreeSize] as? UInt {
                    return "Memory \(freeFileSystemSizeInBytes/1024/1024) of \(fileSystemSizeInBytes/1024/1024) Mb available."
            } else {
                    return failedResult
            }
        } catch {
            return failedResult
        }
    }
}

ব্যবহারবিধি:

print("\(UIDevice.currentDevice().freeDiskspace())")

আউটপুট হবে:

Memory 9656 of 207694 Mb available.

1

আমি জানি এই পোস্টটি কিছুটা পুরানো, তবে আমি মনে করি এই উত্তরটি কাউকে সহায়তা করতে পারে। আপনি যদি ডিভাইসে ব্যবহৃত / মুক্ত / মোট ডিস্কের স্থান জানতে চান তবে আপনি লুমিনাস ব্যবহার করতে পারেন । এটি সুইফটে লেখা হয়েছে। আপনাকে কেবল কল করতে হবে:

Luminous.System.Disk.freeSpace()
Luminous.System.Disk.usedSpace()

অথবা

Luminous.System.Disk.freeSpaceInBytes()
Luminous.System.Disk.usedSpaceInBytes()

1

উপরের কোডটির দ্রুত বাস্তবায়ন: -

import UIKit

class DiskInformation: NSObject {

    var totalSpaceInBytes: CLongLong = 0; // total disk space
    var totalFreeSpaceInBytes: CLongLong = 0; //total free space in bytes

    func getTotalDiskSpace() -> String { //get total disk space
        do{
        let space: CLongLong = try FileManager.default.attributesOfFileSystem(forPath: NSHomeDirectory())[FileAttributeKey.systemSize] as! CLongLong; //Check for home dirctory and get total system size
            totalSpaceInBytes = space; // set as total space
            return memoryFormatter(space: space); // send the total bytes to formatter method and return the output

        }catch let error{ // Catch error that may be thrown by FileManager
            print("Error is ", error);
        }
        return "Error while getting memory size";
    }

    func getTotalFreeSpace() -> String{ //Get total free space
        do{
            let space: CLongLong = try FileManager.default.attributesOfFileSystem(forPath: NSHomeDirectory())[FileAttributeKey.systemFreeSize] as! CLongLong;
            totalFreeSpaceInBytes = space;
            return memoryFormatter(space: space);

        }catch let error{
            print("Error is ", error);
        }
        return "Error while getting memory size";
    }

    func getTotalUsedSpace() -> String{ //Get total disk usage from above variable
        return memoryFormatter(space: (totalSpaceInBytes - totalFreeSpaceInBytes));
    }

    func memoryFormatter(space : CLongLong) -> String{ //Format the usage to return value with 2 digits after decimal
        var formattedString: String;

        let totalBytes: Double = 1.0 * Double(space);
        let totalMb: Double = totalBytes / (1024 * 1024);
        let totalGb: Double = totalMb / 1024;
        if (totalGb > 1.0){
            formattedString = String(format: "%.2f", totalGb);
        }else if(totalMb >= 1.0){
            formattedString = String(format: "%.2f", totalMb);
        }else{
            formattedString = String(format: "%.2f", totalBytes);
        }
        return formattedString;
    }


}

অন্য কোনও ক্লাস থেকে কল করুন।

func getDiskInfo(){
        let diskInfo = DiskInformation();
        print("Total disk space is", diskInfo.getTotalDiskSpace(),"Gb");
        print("Total free space is", diskInfo.getTotalFreeSpace(),"Gb");
        print("Total used space is", diskInfo.getTotalUsedSpace(),"Gb");
    }

প্রত্যাশিত মানটি পরীক্ষা করার সময়, এটি অন্যান্য অ্যাপ্লিকেশনগুলির দেখানো সমান। কমপক্ষে আমার আইফোন 6 এস + এ। এটি কেবল উপরের প্রদর্শিত উত্তরের দ্রুত বাস্তবায়ন। এবং আমার জন্য গৃহীত উত্তর কার্যকর হয়নি।


0

সুইসট ২.১ সংস্করণে ক্রিসজেএফ উত্তর :

func freeSpaceInBytes() -> NSString{

    var remainingSpace = NSLocalizedString("Unknown", comment: "The remaining free disk space on this device is unknown.")

    do {

        let dictionary =  try NSFileManager.defaultManager().attributesOfFileSystemForPath(NSHomeDirectory())
        freeSpaceSize = (dictionary[NSFileSystemFreeSize]?.longLongValue)!
        remainingSpace = NSByteCountFormatter.stringFromByteCount(freeSpaceSize, countStyle: NSByteCountFormatterCountStyle.File)

    }
    catch let error as NSError {

        error.description
        NSLog(error.description)

    }

    return remainingSpace

}

0

আপনি যদি সময় বাঁচাতে চান তবে নীচের কোকোপড লাইব্রেরিটি ব্যবহার করুন। আমি এটি ব্যবহার করি নি তবে মনে হয় এটির কাজ করা উচিত।

https://cocoapods.org/pods/SystemServices


0

FileManagerযথাযথ ত্রুটি পরিচালনা ও কোনও স্বয়ংক্রিয় স্ট্রিং রূপান্তরগুলির জন্য সুইফট 5 এক্সটেনশন (আপনার পছন্দ অনুযায়ী বাইট গণনাটি স্ট্রিংয়ে রূপান্তর করুন)। FileManagerএর নামকরণও অনুসরণ করে।

extension FileManager {
    func systemFreeSizeBytes() -> Result<Int64, Error> {
        do {
            let attrs = try attributesOfFileSystem(forPath: NSHomeDirectory())
            guard let freeSize = attrs[.systemFreeSize] as? Int64 else {
                return .failure(NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey : "Can't retrieve system free size"]))
            }
            return .success(freeSize)
        } catch {
            return .failure(error)
        }
    }

    func systemSizeBytes() -> Result<Int64, Error> {
         do {
             let attrs = try attributesOfFileSystem(forPath: NSHomeDirectory())
             guard let size = attrs[.systemSize] as? Int64 else {
                 return .failure(NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey : "Can't retrieve system size"]))
             }
             return .success(size)
         } catch {
             return .failure(error)
         }
     }
}

ব্যবহারের উদাহরণ:

let freeSizeResult = FileManager.default.systemFreeSizeBytes()
switch freeSizeResult {
case .failure(let error):
    print(error)
case .success(let freeSize):
    let freeSizeString = ByteCountFormatter.string(fromByteCount: freeSize, countStyle: .file)
    print("free size: \(freeSizeString)")
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.