รับทําเว็บไซต์ รับทําseo
 
รับทําเว็บไซต์ รับทําseo
บทความที่น่าสนใจ

บทความ ที่น่าสนใจ

Objective-C : File , Folder and data (ตอนที่2)

     

    NSString Path Category

    คลาส NSString ที่เราคุ้นเคยนั้นมีแคทิกกอรี่เกี่ยวกับ path ชื่อว่า NSPathUtility ฟังก์ชั่นบางตัวเราที่เราได้เรียกใช้จากโปรแกรมทีผ่านๆมาก็เป็นส่วนหนึ่งของแคทิกกอรี่นี้เช่น NSHomeDirectory เป็นต้น ยังมีแคทิกกอรี่หลายตัวที่น่าสนใจดังโปรแกรมตัวอย่างต่อไปนี้

     

    Program 11.4

    Main.m

    #import <Foundation/Foundation.h>

     

    int main(int argc, const char * argv[])

    {

     

        @autoreleasepool {

     

            NSString* path = nil;

            NSString* fullPath = nil;

     

            // Temp directory

            NSLog (@"Temporary Directory is %@", NSTemporaryDirectory ());

     

            // Last path

            path = NSHomeDirectory(); 

            NSLog(@"Current %@",path);

            NSLog(@"Last path: %@", [path lastPathComponent]);

     

            // full path

            fullPath = [path stringByAppendingPathComponent: @"test.txt"];

            NSLog(@"Fullpath: %@", fullPath);

     

            // Get the file name extension

            NSLog (@"extension %@", [fullPath pathExtension]);

     

            // Divide a path into its components

            NSString* home = NSHomeDirectory();

            NSArray* components = [home pathComponents];

            for ( path in components )

                NSLog (@"%@", path);

     

        }

        return 0;

    }

     

    Program 11.4 Output


    Temporary Directory: /var/folders/_f/xp9j55592s97kgl19kf9p8w40000gp/T/

    Current: /Users/Ter

    Last path: Ter

    Fullpath: /Users/Ter/test.txt

    Extension: txt

    /

    Users

    Ter

     

    NSData

    คลาส NSData นี้เป็นคลาสที่ใช้ในการจองและจัดการกับ Buffer โดยตรงหรือเรียกว่า Byte Buffer คลาส NSData นี้ก็มีคลาสคู่แฝดเช่นเดียวกันกับคลาส Foundation อื่นๆคือคลาสมีทั้งแบบ mutable และ immutable ตัวอย่างโปรแกรมที่ผ่านมาเราใช้่คลาส NSFileManager ในการจัดการไฟล์และโฟลเดอร์ เช่นการ คัดลอก แต่ยังไม่ได้ใช้เมธอดทีเกี่ยวกับการอ่านข้อมูล และการข้อมูลลงไฟล์ โปรแกรมที่เราจะเขียนกันต่อไปนี้เราจะใช้คลาส NSData ร่วมกับ NSFileManager อ่านและเขียนข้อมูล

     

    Program 11.5

    Main.m

    #import <Foundation/Foundation.h>

     

    int main(int argc, const char * argv[])

    {

     

        @autoreleasepool {

     

            NSFileManager* fileMgr = [NSFileManager defaultManager];

     

            NSString* text = @"Xcode is the integrated development environment (IDE) designed"

            "for developing iOS and Mac apps. The Xcode IDE includes editors used to design and"

            "implement your app, such as a source code editor and a user interface editor.";

     

            NSString* desktop = [NSString stringWithFormat:@"%@/Desktop",NSHomeDirectory()];

            [fileMgr changeCurrentDirectoryPath:desktop];

     

            NSString* currentPath = [fileMgr currentDirectoryPath];        

            NSString* textFile = [currentPath stringByAppendingPathComponent:@"test.txt"];

     

            //Prepare data

            NSData* writeData = [text dataUsingEncoding:NSUnicodeStringEncoding];

     

            // Write data

            if ([fileMgr createFileAtPath:textFile contents:writeData attributes:nil])

                NSLog(@"Create a new file success");

     

            // Read data

            NSData* readData = [fileMgr contentsAtPath:textFile];

            NSString* readText= [[NSString alloc] initWithData:readData

                                                       encoding:NSUnicodeStringEncoding];

            NSLog(@"%@",readText);

     

            [readText release];

     

        }

        return 0;

    }

     

    โปรแกรมเริ่มจากการเปลี่ยน path ไปทำงานที่ desktop ของผู้ใช้งาน จากนั้นเราก็เตรียมข้อมูลที่จะใช้ในการเขียน

    NSData* writeData = [text dataUsingEncoding:NSUnicodeStringEncoding];

    คลาส NSString มีเมธอด dataUsingEncoding:  ที่ช่วยในการแปลงข้อมูลเป็น NSData และเราต้องกำหนด encode ของข้อมูลที่ต้องการ โปรแกรมตัวอย่างกำหนดให้เป็น unicode (encode อื่นๆเช่น utf8 , ascii ดูการใช้ได้ใน Document ) หลังจากนั้นเราก็ให้ File Manager ของเราเขียนข้อมูลดังกล่าวลงไฟล์ เมื่อเสร็จเรียบร้อยเพื่อความแน่ใจว่าข้อมูลถูกต้อง เราก็อ่านข้อมูลจากไฟล์ที่เพิ่งได้เขียนไปและแสดงผลทาง console

     

    Program 11.5 Output


    Create a new file successed

    Xcode is the integrated development environment (IDE) designed for developing iOS and Mac apps. The Xcode IDE includes editors used to design and implement your app, such as a source code editor and a user interface editor.

     

    อย่างไรก็ตามเราไม่จำเป็นต้องใช้คลาส NSFileManger เพื่ออ่านข้อมูลก็ได้ เพราะคลาส NSData นั้นมีเมธอดในการอ่านและเขียนข้อมูลอยู่แล้ว เช่นโค้ดตัวอย่างดังนี้

     

    NSMutableData* data = [NSMutableData dataWithContentsOfFile:path];


    [data writeToFile:path atomically:YES];

    NSFileHandle

     

    คลาส NSFileHandle ถูกแบบมาเพื่อให้ห่อฟังก์ชั่นที่เรียกใช้งานของ file descriptor เพื่อช่วยอำนวยความสะดวกมากขึ้น หรือเรียกว่า wrapper class นั่นเอง NSFileHandle จะเน้นหนักไปทางการใช้งานกับไฟล์และข้อมูลโดยตรง เช่น การหาตำแหน่งของข้อมูลในไฟล์ที่ต้องการ ซึ่งจะต่าง NSFileManager ที่จะเน้นการจัดการไฟล์

     

    การใช้งาน NSFIleHandle จะมีขั้นตอนหลักๆด้วยกัน 3 ขั้นตอนคือ เปิดไฟล์ที่ต้องการ จากนั้นก็เริ่มทำงานกับไฟล์ที่ถูกเปิดขึ้นมา และหลังจากใช้งานเสร็จเรียบร้อยก็ปิดไฟล์ เราจะเขียนโปรแกรมขึ้นมาทดลองใช้งาน NSFileHandle โดยโปรแกรมที่เราจะสร้างขึ้นมาใหม่นี้จะอ่านข้อความจากไฟล์ read.txt ซึ่งมีข้อความ Xcode is the integrated development environment และนำข้อความนี้มาต่อท้ายไฟล์ write.txt ซึ่งมีข้อความ Hello อยู่ก่อนหน้าแล้ว

     

    Program 11.6

    Main.m

    #import <Foundation/Foundation.h>

    int main(int argc, const char * argv[])

    {

     

        @autoreleasepool {

     

            NSFileHandle* fileReader;

            NSFileHandle* fileWriter;

            NSData* buffer;

     

            NSString *readPath = [NSHomeDirectory()

                                 stringByAppendingPathComponent:@"/Desktop/read.txt"];

     

            NSString *writePath = [NSHomeDirectory()

                                  stringByAppendingPathComponent:@"/Desktop/write.txt"];

     

            fileReader = [NSFileHandle fileHandleForReadingAtPath:readPath];

            fileWriter = [NSFileHandle fileHandleForWritingAtPath:writePath];

     

            if( fileWriter != nil && fileReader != nil)

            {

                [fileWriter seekToEndOfFile];

     

                do

                {

                    buffer = [fileReader readDataOfLength:128];

                    [fileWriter writeData:buffer];

     

                } while (buffer != nil && [buffer length] > 0);

     

                [fileWriter closeFile];

                [fileReader closeFile];

     

                NSLog(@"Content of file(R):");

                NSLog(@"%@",[NSString stringWithContentsOfFile:readPath

                                                      encoding:NSUTF8StringEncoding

                                                         error:nil]);

     

                NSLog(@"Content of file(W):");

                NSLog(@"%@",[NSString stringWithContentsOfFile:readPath

                                                      encoding:NSUnicodeStringEncoding

                                                         error:nil]);

     

            }

     

        }

        return 0;

    }

     

    เริ่มด้วยการประกาศออบเจ็กต์ NSFileHandle สองตัวคือ fileReader เพื่ออ่านข้อมูลในไฟล์ read.txt และ fileWrite เพื่อเขียนไปยังไฟล์ write.txt เมธอดที่ใช้ในการเปิดไฟล์เพื่ออ่านข้อมูลคือ fileHandleForReadingAtPath: เมธอดนี้จะเปิดไฟล์เพื่ออ่านข้อมูลอย่างเดียว ส่วนอีกเมธอดที่ทำหน้าเขียนไฟล์ก็จะทำหน้าที่แค่เขียนอย่างเดียวเท่านั้นไม่สามารถใช้อ่านข้อมูลได้ และเพื่อให้แน่ใจว่าสามารถใช้ไฟล์ทั้งสองได้จึงเขียนเงื่อนไขตรวจสอบก่อน เมื่อผ่านขั้นตอนนี้ไป เราจะต้องการจะเขียนข้อมูลต่อท้ายไฟล์ ดังนั้นจึงต้องเรียกเมธอด seekToEndOfFile เพื่อขยับตำแหน่งที่ใช้ในการเขียนไฟล์ไปยังท้ายสุดของไฟล์ จากนั้นเริ่มเข้าสู่ loop การอ่านและเขียนไฟล์


    do

    {

        buffer = [fileReader readDataOfLength:128];

        [fileWriter writeData:buffer];

     

    } while (buffer != nil && [buffer length] > 0);

     

    เมธอด readDataOfLength จะอ่านข้อมูลด้วยทีละ 128 Bytes และเก็บไว้ที่ buffer หลังจากนั้น fileWrite ก็จะเขียนข้อมูลที่ได้ไปยังไฟล์ โปรแกรมจะทำงานไปเรื่อยๆจนกว่า fileReader จะอ่านข้อมูลไปจนถึงส่วนสุดท้ายของไฟล์หรือไม่มีข้อมูลให้อ่านต่อ หลังจากเสร็จสิ้นการอ่านและเขียนข้อมูลแล้ว เราก็ต้องทำการปิดไฟล์ทั้งสอง ด้วยการเรียกเมธอด closeFile นั่นเอง โปรแกรมก็จะแสดงผลดังนี้

     

    Program 11.6 Output


    Content of file(R):

    Xcode is the integrated development environment (IDE)


    Content of file(W):

    Hello Xcode is the integrated development environment (IDE)

     

    โปรแกรมที่ได้เขียนไปเราอาจจะเขียนส่วนของการอ่านข้อมูลให้้โดยไม่ต้องใช้ลูปก็ได้ดังเช่นโค้ดต่อไปนี้

     

    buffer = [fileReader readDataToEndOfFile];

     

    คลาส NSFileHandle มีหน้าที่หลักคือใช้จัดการข้อมูลในไฟล์ ดังนั้นแล้วจึงไม่มีเมธอดที่ใช้ในจัดการไฟล์ เช่น การสร้างไฟล์ ดังนั้นเราต้องใช้คลาส NSFileManager เพื่อใช้ในการทำหน้าที่จัดการไฟล์

     

    NSBundle

    ปกติแล้วเมื่อเราเขียนโปรแกรมขึ้นมา ระบบจะทำการรวบรวมสิ่งที่โปรแกรมจำเป็นต้องใช้ อาทิเช่น รูปภาพ หรือ library ต่างๆ  เข้าไว้ด้วยกันและเรียกว่า Applicaiton Bundle คลาส NSBundle ได้ใช้เป็นประจำเมื่อต้องเขียนโปรแกรมแบบที่ไม่ใช่ Console เช่น iOS Applicaiton หรือ Mac OS X Application คลาสนี้มีเมธอดที่สำคัญอยู่หลายเมธอด อาทิเช่น เมธอดที่บอกว่าโปรแกรมของเราทำงานที่ path ใด หรือเมธอดช่วยในการหา resource path ของโปรแกรม เป็นต้น

     

    เราจะเขียนโปรแกรมเพื่อหาว่าโปรแกรมที่ของเรานั้นทำงานอยู่ที่ใด และทำงานบนเครื่อง 64 bit หรือ 32 bit โดยโปรแกรมมีโค้ดง่ายๆดังต่อไปนี้

     

    Program 11.7

    Main.m

    #import <Foundation/Foundation.h>

    int main(int argc, const char * argv[])

    {

     

        @autoreleasepool {

     

            NSString* exePath = [[NSBundle mainBundle] executablePath];

            NSArray* archtecture = [[NSBundle mainBundle] executableArchitectures];

     

            NSDictionary* info = [[NSBundle mainBundle] infoDictionary];

     

            NSLog(@"%@",exePath);

     

            NSNumber* arch = [archtecture lastObject];

            if( [arch integerValue] == NSBundleExecutableArchitectureX86_64)

                NSLog(@"64-bit Intel");

     

            if( [arch integerValue] == NSBundleExecutableArchitectureI386)

                NSLog(@"32-bit Intel");

     

            NSLog(@"%@",info);

     

        }

        return 0;

    }

    Program 11.7 Output

    /Program_11.7-/Build/Products/Debug/Program 11.7

    64-Bit Intel

    {

    CFBundleExecutablePath = “/Program_11.7-/Build/Products/Debug/Program 11.7″;

    NSBundleInitialPath = “/Program_11.7-/Build/Products/Debug”;

    NSBundleResolvedPath = “/Program_11.7-/Build/Products/Debug”;
}

     

    NSURL

    โปรแกรมที่ผ่านมาถ้าสังเกตจะเห็นว่าเมื่อเราอ้างอิงที่อยู่ของไฟล์ต่างๆเรามักจะใช้ NSString ในการอ้างอิงเสมอ แต่ในบางครั้งการใช้ NSString อ้างอิงที่อยู่ไฟล์อาจจะไม่ครอบคลุมนัก เช่น ไฟล์ที่อยู่บนอินเทอร์เน็ต เป็นต้น ใน Foundation Framework นี้มีคลาส NSURL เพื่อช่วยอำนวยความสะดวกให้เราในอ้างอิงไฟล์  เราจะเขียนโปรแกรมง่ายๆเพื่อใช้อ่านข้อมูลที่อยู่บนอินเทอร์เน็ต และแสดงผลทาง console

     

    Program 11.8

    Main.m

    #import <Foundation/Foundation.h>

    int main(int argc, const char * argv[])

    {

     

        NSURL* url = [NSURL URLWithString:@"http://macfeteria.com/feed"];

     

        NSString *feedData = [NSString stringWithContentsOfURL: url

                                                        encoding: NSUTF8StringEncoding

                                                           error: NULL];

     

        NSLog(@"%@",feedData);

     

        return 0;

    }

    Program 11.8 Output

    <?xml version=”1.0″ encoding=”UTF-8″?>

    <rss version=”2.0″ xmlns:content=”http://purl.org/rss/1.0/modules/content/”

    ….

    </rss>

     

    เพียงโค้ดไม่กี่บรรทัดเท่านี้เราก็สามารถเชื่อมต่อกับ internet ได้แล้ว นอกจากนี้แล้วคลาสต่างๆของ Foundation Framework ยังมีเมธอดต่างๆที่รองรับ NSURL เช่นคลาส NSArray มีเมธอด arrayWithContentOfURL: เช่นตัวอย่างโปรแกรม 11.9

    Program 11.9

    Main.m

    #import <Foundation/Foundation.h>

    int main(int argc, const char * argv[])

    {

     

        @autoreleasepool {

     

            NSURL* arrayURL = [NSURL URLWithString:@"https://raw.github.com/macfeteria"

            "/Objective-C-Demo/master/Chapter%2011/Program%2011.9/Program%2011.9/"

            "arrayData.xml"];

     

            NSURL* dictURL = [NSURL URLWithString:@"https://raw.github.com/macfeteria"

            "/Objective-C-Demo/master/Chapter%2011/Program%2011.9/Program%2011.9/"

            "dictionaryData.xml"];

     

            NSURL* arrayFileURL = [NSURL fileURLWithPath:@"/User/Ter/Desktop/array.txt"];

     

            NSDictionary* dictData = [NSDictionary dictionaryWithContentsOfURL:dictURL];

            NSLog(@"Dictionary:");

            NSLog(@"%@",dictData);

     

            NSArray* arrayData = [NSArray arrayWithContentsOfURL:arrayURL];

            NSLog(@"Array:");

            NSLog(@"%@",arrayData);

     

            NSArray* arrayFileData = [NSArray arrayWithContentsOfURL:arrayFileURL];

            NSLog(@"Array file:");

            NSLog(@"%@",arrayFileData);

     

        }

        return 0;

    }

    Program 11.9 Output

    Dictionary:

    {

        Apple = iPhone;

        Blackberry = Z10;

        Samsung = Galaxy;

    }

    Array:

    (

        Banana,

        Mango,

        Orange

    )

    Array file:

    (

        Dog,

        Cat,

        Lion

    )

     

    จากโปรแกรมง่ายๆจะเห็นได้ว่าคลาส NSURL นั้นสามารถกำหนด path ได้ทั้งไฟล์ที่อยู่บนเครื่องและอินเทอร์เน็ต อย่างไรก็ตามการเมธอดที่ช่วยดึงข้อมูลจาก internet ของ foundation class ที่ได้เขียนไปนั้น เป็นเพียงการใช้งาน Network อย่างง่ายเท่านั้น และในบทหลังๆเราจะเรียนรู้เกี่ยวกับคลาสที่เป็นเกี่ยวของกับระบบ Network โดยตรง

     

     

บทความที่น่าสนใจ

บทความ ล่าสุด

บทความ ความรู้ด้านไอที, คอมพิวเตอร์ Techonlogy, Gadget, ความรู้เกี่ยวกับคอมพิวเตอร์ กับทาง SoftMelt.com