2014年4月10日 星期四

How To Read a File From Your Application Bundle

http://iphoneincubator.com/blog/data-management/how-to-read-a-file-from-your-application-bundle

First you need to add your file to the Resources folder of your Xcode project. Then you can access the file like this (assuming the file is called MyFile.txt):
  1. NSString *filePath = [[NSBundle mainBundle] pathForResource:@"MyFile" ofType:@"txt"];  
  2. NSData *myData = [NSData dataWithContentsOfFile:filePath];  
  3. if (myData) {  
  4.     // do something useful  
  5. }  
Here’s a complete example reading a help text file into a UIWebView.
  1. NSString *filePath = [[NSBundle mainBundle] pathForResource:@"HelpDoc" ofType:@"htm"];  
  2. NSData *htmlData = [NSData dataWithContentsOfFile:filePath];  
  3. if (htmlData) {  
  4.     [webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@"http://iphoneincubator.com"]];  
  5. }  
If you want to read the file into a string, which you can then display in a UITextView, for example, then do this:
  1. NSString *filePath = [[NSBundle mainBundle] pathForResource:@"important" ofType:@"txt"];  
  2. if (filePath) {  
  3.     NSString *myText = [NSString stringWithContentsOfFile:filePath];  
  4.     if (myText) {  
  5.         textView.text= myText;  
  6.     }  
  7. }  

ios blog

http://stephen830.iteye.com/category/211210

(转载)StoryBoard学习(1):一个简单例子

给iOS开发新手送点福利,简述UIAlertView的属性和用法

UIAlertView

1.Title

获取或设置UIAlertView上的标题。

2.Message

获取或设置UIAlertView上的消息
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Title" message:@"message" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
    alertView.title = @"T";
    alertView.message = @"M";
 
    [alertView show];
 

3.numberOfButtons (只读)

返回UIAlertView上有多少按钮.
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Title" message:@"message" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
    NSLog(@"%d",alertView.numberOfButtons);
[alertView show];


4.cancelButtonIndex

   UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"请选择一个按钮:" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"按钮一", @"按钮二", @"按钮三",nil];
   [alert show];
NSLog(@"UIAlertView中取消按钮的角标是%d",alert.cancelButtonIndex);
效果:
 
注意不要认为取消按钮的角标是4,“取消”,“按钮一”,“按钮二”,“按钮三”的索引buttonIndex分别是0,1,2,3
 

5. alertViewStyle

5.1 UIAlertViewStyleLoginAndPasswordInput

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"产品信息展示" message:p.name delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
   
alert.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput;
   
// 弹出UIAlertView
 [alert show];
 


5.2 UIAlertViewStylePlainTextInput

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"产品信息展示" message:p.name delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
   
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
   
// 弹出UIAlertView
 [alert show];
 
 

5.3 UIAlertViewStyleSecureTextInput

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"产品信息展示" message:p.name delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
   
alert.alertViewStyle = UIAlertViewStyleSecureTextInput;
   
// 弹出UIAlertView
 [alert show];


6. - (UITextField *)textFieldAtIndex:(NSInteger)textFieldIndex

返回textFieldIndex角标对应的文本框。
取出文本框文字

7.手动的取消对话框

[alert dismissWithClickedButtonIndex:0 animated:YES];

8. delegate

作为UIAlertView的代理,必须遵守UIAlertViewDelegate。

1.当点击UIAlertView上的按钮时,就会调用,并且当方法调完后,UIAlertView会自动消失。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;
 

2.当UIAlertView即将出现的时候调用

- (void)willPresentAlertView:(UIAlertView *)alertView;

3. 当UIAlertView完全出现的时候调用

- (void)didPresentAlertView:(UIAlertView *)alertView; 
 

4. 当UIAlertView即将消失的时候调用

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex;

5. 当UIAlertView完全消失的时候调用

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex; 

9.注意UIAlertView调用show显示出来的时候,系统会自动强引用它,不会被释放。

10. 为UIAlertView添加子视图

在为UIAlertView对象太添加子视图的过程中,有点是需要注意的地方,如果删除按钮,也就是取消UIAlerView视图中所有的按钮的时候,可能会导致整个显示结构失衡。按钮占用的空间不会消失,我们也可以理解为这些按钮没有真正的删除,仅仅是他不可见了而已。如果在UIAlertview对象中仅仅用来显示文本,那么,可以在消息的开头添加换行符(@"\n)有助于平衡按钮底部和顶部的空间。
下面的代码用来演示如何为UIAlertview对象添加子视图的方法。
UIAlertView*alert = [[UIAlertView alloc]initWithTitle:@"请等待" message:nil delegate:nil  cancelButtonTitle:nil otherButtonTitles:nil];
[alert show];
UIActivityIndicatorView*activeView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
activeView.center = CGPointMake(alert.bounds.size.width / 2.0f, alert.bounds.size.height - 40.0f);
[activeView startAnimating];
[alert addSubview:activeView];

 11. UIAlertView小例子

  UIAlertView默认情况下所有的text是居中对齐的。 那如果需要将文本向左对齐或者添加其他控件比如输入框时该怎么办呢? 不用担心, iPhone SDK还是很灵活的, 有很多delegate消息供调用程序使用。 所要做的就是在
- (void)willPresentAlertView:(UIAlertView *)alertView

中按照自己的需要修改或添加即可, 比如需要将消息文本左对齐,下面的代码即可实现:
-(void) willPresentAlertView:(UIAlertView *)alertView
{
      for( UIView * view in alertView.subviews )
      {
            if( [view isKindOfClass:[UILabel class]] )
            {
                  UILabel* label = (UILabel*) view;
                  label.textAlignment=UITextAlignmentLeft;
            }
      }
}
 

2014年4月2日 星期三

关于 Mac OSX Mountain Lion 10.8 安装U盘 制作 图文安装教程

http://jiaocheng.7do.net/resources-4536-1-1.html

[系统教程] 关于 Mac OSX Mountain Lion 10.8 安装U盘 制作 图文安装教程   [复制链接]
Rank: 9Rank: 9Rank: 9
跳转到指定楼层
楼主
发表于 2012-7-28 10:29:01 |只看该作者 |倒序浏览
苹果在Mac App Store提供了Mountain Lion的下载,并一改传统,不再提供USB版的安装程序。但是,如果你家里有两台以上的Mac,用U盘来安装显然节省更多时间。因此,我们在购买了Mountain Lion之后,先不急着安装,首先来自制一个安装U盘。
% E, d4 j+ D& @4 q- a. @ 七度苹果电脑软件
; A) p" F! w7 W 七度苹果电脑软件
, V/ J, N; g0 X 七度苹果电脑软件  第一,Mountain Lion下载完成后,系统将提示重启计算机来开始安装。先不急着重启。0 S, n' r. {1 u6 [- h 七度苹果电脑软件
5 m5 n2 v$ j. U6 [  j- d 七度苹果电脑软件

& l1 m9 ~* g+ E3 G/ s 七度苹果电脑软件  第二,下载后在应用程序文件夹内会看到一个“安装OS X Mountain Lion”的程序,如果刚才你重启了电脑,安装完成后这个文件会自动删除。这就是刚才不急着重启的原因。按下“Option”键,把这个安装程序复制一份到你的文件夹或桌面。确定复制了至少一份之后,这才可以点击重启。
) V% R. W+ s- Q8 I9 | 七度苹果电脑软件
; R( S* |1 W. g- M 七度苹果电脑软件- M1 y" T( i" m; O# J  @' F 七度苹果电脑软件
  第三,准备一个至少有8GB空间的U盘。制作安装U盘的过程需要25分钟,实际上你只需要5分钟操作,另外20分钟你完全可以走开去泡杯茶。
3 }* L: V; R3 w5 M 七度苹果电脑软件
, @$ K( u; o- K 七度苹果电脑软件" C3 r) Y' F  r4 \+ |6 l 七度苹果电脑软件
第四,开始制作。找到你刚刚复制好的安装程序,右键“显示包内容”。然后再点击“内容”——“共享支持”,该目录包含一个叫InstallESD.dmg的文件,把这个文件拖拽到桌面。2 y' d1 O2 K7 p 七度苹果电脑软件
" n; O3 E  p# [" F& n 七度苹果电脑软件
, h! S$ m* M/ W# P5 P 七度苹果电脑软件
8 C; K  z+ _: z  a0 | 七度苹果电脑软件
  第五,打开“磁盘工具”
2 ~) g: {; k' U5 Q$ T 七度苹果电脑软件9 Q* D, ~! Y3 C* o+ {  ` 七度苹果电脑软件

% ]; \/ n# ?( l 七度苹果电脑软件
8 U& K1 |3 `6 A3 ]0 A 七度苹果电脑软件  第六,把桌面的InstallESD.dmg文件拖到磁盘工具左边,并双击该文件。% |0 f3 x& o2 | 七度苹果电脑软件

" c2 D# ^$ [5 z! H+ E/ a 七度苹果电脑软件! g( @$ d; ?+ |5 j& X 七度苹果电脑软件
, R" M/ v1 _, r2 H# P: I 七度苹果电脑软件

2 e. G4 n* i+ V* x2 E3 | 七度苹果电脑软件  第七,把U盘插入电脑,在磁盘工具左边选择U盘,再点击右边的分区,分区布局选择“1个分区”,然后点击“选项”,选择GUID分区表后再点击“好”。这样分区的目的是确保制作的安装U盘可引导安装程序。- A; n) V1 ]) a* \" h 七度苹果电脑软件

* B" @% W+ n/ o1 A: z- J 七度苹果电脑软件
2 ~  H0 `$ ~" L' ]' C9 m 七度苹果电脑软件4 a1 w$ h* b1 y8 A: d  v 七度苹果电脑软件
  第八,再从磁盘工具左边选择U盘,点击右上角的“恢复”。你将看到InstallESD.dmg在“源磁盘”一栏,把U盘从左边拖拽进“目的磁盘”,点击“恢复”" [+ X/ j5 B" J, j 七度苹果电脑软件

- N, S* b4 |8 U5 M. b; v 七度苹果电脑软件
3 p6 ]3 I0 P7 z) | 七度苹果电脑软件
! \) N" U$ Q6 _, v8 { 七度苹果电脑软件  最后,系统提示输入密码,输入密码即开始恢复。完成后,你就可以用这个U盘给其他Mac安装Mountain Lion系统了。

Cocos2d簡介

http://bonjouryentinglai.wordpress.com/2009/11/30/cocos2d%e7%b0%a1%e4%bb%8b/

所謂工欲善其事,必先利其器。剛開始學iPhone軟體開發時,什麼都不懂,也沒有先去收集資訊,只是去網拍買了一本iPhone開發的工具書以及下載Apple官網的文件,就硬著頭皮一步步的學著寫。直到一次偶然的機會,看到國外的網站在討論cocos2d這個library,看了一下使用方法與教學後,這才發覺用cocos2d寫遊戲是件這麼容易的事情。
Cocos2d是一個開放原始碼的framework,它的主要功能是提供開發者一個簡單易用的函式庫,使開發者在開發遊戲時能專注在遊戲的設計與邏輯架構,而無需去擔心其它技術上瑣碎的問題。另外,依據官方的授權說明,基本上開發者可以免費使用它,同時使用它所開發的程式都可以在不公開原始碼的情況下進行販售。雖然說是免費使用,不過在這裡還是建議大家,如果哪天您用cocos2d開發的遊戲在app store上賺了大錢,記得回饋一點給cocos2d開發團隊。有了您的支持,開發團隊才能持續的維護cocos2d,並為它加入更多方便好用的功能。
Cocos2d提供了許多開發遊戲時需要的類別物件,但因種類繁多,不太可能在這裡一次介紹完。下面我將列舉幾個常用且重要的類別,作一個概略的介紹,剩下其它的功能,就等之後實作遇到時再加以說明。
CocosNode
CocosNode是cocos2d裡很重要的一個類別。在程式中如果遇到物件需要移動、顯示或者改變大小等事件,都可以透過CocosNode來進行處理。通常使用上不會直接宣告一個CocosNode物件,而是繼承它的特性並建立自已需要的物件類別。
CocosNode本身包含了許多可供調整的變數,比方說:
  • position:設定物件位置
  • scale:設定物件縮放
  • rotation:設定物件旋轉
  • contentSize:取得物件像素大小
有了這些參數,在遊戲中要讓物件移動或改變大小就不是件困難的事了。另外CocosNode有個很重要的函式addChild。在cocos2d程式中,常常會把某個CocosNode加到另一個CocosNode上,讓兩個CocosNode疊在一起進行其它相關指令。如果要移除已加入的CocosNode物件,則是用removeChild
//加入CocosNode
[firstNode addChild: secondNode];
//移除CocosNode
[firstNode removeChild:secondNode];
CocosNode算是個很基本的類別,如果一個自己建立的物件只繼承它,那還是有很多的功能要自己補完。所以cocos2d也準備了幾個繼承CocosNode的副類別,增加了一些常用的功能,使我們在開發遊戲時更加方便。比如下面要介紹的Sprite,就是一個很好的例子。
Sprite
遊戲開發最常遇到的就是圖檔。不論是遊戲背景,遊戲角色,甚至是主角手那把雷射槍的子彈,都與圖檔脫離不了關係。Sprite繼承於CocosNode,它是一個專門用來處理圖形物件的類別。有關圖形的位置、大小、旋轉及透明度等設定都可以透過Sprite來處理。使用方法很簡單:
//建立一個新的Sprite物件mySprite,用來存取myFigure.png
Sprite *mySprite = [Sprite spriteWithFile:@"myFigure.png"];
//把mySprite貼到某一個node上
[someNode addChild:mySprite];
這裡要注意的是,把Sprite物件建立好後並不會顯示在畫面上。必需把它加入某個已顯示在畫面上的node,sprite所對應的圖形才會出現。也許您會好奇,那麼在什麼都沒有的畫面上,第一個建立的Sprite物件要加到哪裡呢?這時我們會用到Cocos2d裡兩個很重要的物件:Scene和Layer。
Scene & Layer
Cocos2d上遊戲畫面的顯示,主要由Scene和Layer這兩個物件負責。Scene是場景的意思。一個遊戲通常會擁有許多場景,比方遊戲畫面、遊戲說明、分數列表,這些都會由其對應的場景物件負責處理。Scene是一個用來放置CocosNode的容器,通常遊戲的背景圖案會放在Scene裡面:
//建立一個Scene物件
Scene *myScene = [Scene node];
//建立一個包含背景圖檔的Sprite
Sprite *bg = [Sprite spriteWithFile:@"background.png"];
//把背景sprite 加到Scene物件裡
[myScene addChild:bg];
基本上只要是繼承CocosNode的副類別(像:Sprite)都可以疊在Scene物件上。但有些跟遊戲控制如觸控之類的事件,就不是Scene的工作範圍,因此這時會用另一個繼承CocosNode的副類別:Layer來處理。
Scene負責的是現在螢幕呈現的是哪一個遊戲場景,而Layer負責的是這個場景裡和玩家互動的所有物件。一個Scene可以包含許多個Layer。通常我們會先在Scene裡放一個遊戲背景(其實要放在Layer也行),然後在上面再加入許多Layer。每個Layer各司其職,有的負責執行背景動畫,有的負責主要物件的動作,有的則是用來處理和玩家互動的按鈕。如果你喜歡,上述的幾個工作也可以只用一個Layer來處理,純粹是看程式設計需求而定。如果要建立一個Layer並放到Scene上面,程式的寫法如下:
Layer *myLayer = [myCustomLayer node];
[myScene addChild:myLayer];
另外要補充說明的是,如果要在不同的Scene中切換,在cocos2d中是使用Director這個指令:
//建立一個要切換的Scene物件
Scene *newScene = [Scene node];
//藉由Director切換至新的Scene
[[Director shareDirector] replaceScene:newScene];
除了用來切換不同的Scene之外,Director也可以用來管理遊戲的流程,比方說:
//暫停遊戲場景
[[Director shareDirector] pause];
//從暫停中回到遊戲
[[Director shareDirector] resume];
//結束遊戲場景
[[Director shareDirector] end];
有了Director負責管理遊戲的流程,並配合Scene和Layer的使用,在開發遊戲上是不是方便許多呢?
Action
最後要介紹的是在cocos2d中相當有趣的功能。在遊戲中,我們常常可以看到物體由A點移動到B點,或者讓物體彈跳並且旋轉。這些動作都可以在cocos2d中藉由幾個預設的Action類別達成目的。
//移動某個Sprite
[mySprite runAction: [MoveTo actionWithDuration:1.0 position:ccp(0,0)]];
//使某個Sprite彈跳移動
[mySprite runAction:[JumpBy actionWithDuration:1.0 position:ccp (320,240) height:2.0 jumps:5]];
//使某個Sprite淡出至透明
[mySprite runAction:[FadeTo actionWithDuration:1.0 opacity:0]];
Cocos2d的簡介到這裡暫時先告一段落,如果想要對cocos2d有更進一步的認識,可以到他們的官方網站逛逛。Cocos2d裡所有類別的說明也可以在這裡找到。
到目前為止該介紹的都介紹的差不多了,從下一篇開始,將進入實際操作的部份。趕快準備好您的mac,我們要開始寫程式囉~

开源SMTP协议实现 skpsmtpmessage

http://disanji.net/2011/01/28/skpsmtpmessage-open-source-framework/

开源SMTP协议实现 skpsmtpmessage
来自  Aladdin
10,133 次阅读 评论 (1)
源码地址:
googlecode      http://code.google.com/p/skpsmtpmessage/
svn checkout http://skpsmtpmessage.googlecode.com/svn/trunk/ skpsmtpmessage-read-only
github:
git clone https://github.com/kailoa/iphone-smtp.git
skpsmtpmessage 是由Skorpiostech, Inc.为我们带来的一个SMTP协议的开源实现,使用Objective-c 实现,iOS系统的项目可以直接调用 =]
skpsmtpmessage能够实现不使用iOS系统提供的发送email的两种方法,发送email的功能。

iOS系统框架提供的两种发送Email的方法


使用openURL来实现发邮件的功能:
NSString *url = [NSString stringWithString: @"mailto:foo@example.com?cc=bar@example.com&subject=Greetings%20from%20Cupertino!&body=Wish%20you%20were%20here!"];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];
缺点很明显,这样的过程会导致程序暂时退出,即使在iOS 4.x支持多任务的情况下,这样的过程还是会让人觉得不是很方便。这对于开发者而言应该是最简单的实现了,也是在iOS3.0以下唯一的方法来实现发送Email,但是现在也可以使用MFMailComposeViewController来实现发邮件的功能,它在MessageUI.framework中,你需要在项目中加入该框架,并在使用的文件中导入MFMailComposeViewController.h头文件。
#import <MessageUI/MFMailComposeViewController.h>
 
MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setSubject:@"My Subject"];
[controller setMessageBody:@"Hello there." isHTML:NO];
[self presentModalViewController:controller animated:YES];
[controller release];
使用该方法实现发送Email是最常规的方法,该方法有相应的MFMailComposeViewControllerDelegate事件:
- (void)mailComposeController:(MFMailComposeViewController*)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError*)error;
{
if (result == MFMailComposeResultSent) {
NSLog(@"It's away!");
}
[self dismissModalViewControllerAnimated:YES];
}
有一些相关的数据结构的定义在头文件中都有具体的描述:
enum MFMailComposeResult {
MFMailComposeResultCancelled,//用户取消编辑邮件
MFMailComposeResultSaved,//用户成功保存邮件
MFMailComposeResultSent,//用户点击发送,将邮件放到队列中
MFMailComposeResultFailed//用户试图保存或者发送邮件失败
};
typedef enum MFMailComposeResult MFMailComposeResult; // iOS3.0以上有效
在头文件中MFMailComposeViewController的部分方法顺便提及:
+ (BOOL)canSendMail __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
//如果用户没有设置邮件账户,则会返回NO,你可以用根据返回值来决定是使用MFMailComposeViewController 还是 mailto://的传统方法,也或者,你可以选择上文中提到的skpsmtpmessage来实现发送Email的功能。
- (void)addAttachmentData:(NSData *)attachment mimeType:(NSString *)mimeType fileName:(NSString *)filename;
//NSData类型的attachment自然不必多说,关于mimeType需要一点说明,官方文档里给出了一个链接http://www.iana.org/assignments/media-types/ ,这里列出的所有的类型都应该支持。关于mimeType的用处,更多需要依靠搜索引擎了 =]
第二种方法的劣势也很明显,iOS系统替我们提供了一个mail中的UI,而我们却完全无法对齐进行订制,这会让那些定制化成自己风格的App望而却步,因为这样使用的话无疑太突兀了。
因此在这里使用第三方的发送邮件的实现就比较合适,我们可以根据自己的UI设计需求来定制相应的视图以适应整体的设计。
在SKPSMTPMessage类中,并没有对视图进行任何的要求,它提供的都是数据层级的处理,你之需要定义好相应的发送要求就可以实现邮件发送了。至于是以什么样的方式获取这些信息,就可以根据软件的需求来确定交互方式和视图样式了。
                SKPSMTPMessage *testMsg = [[SKPSMTPMessage alloc] init];
testMsg.fromEmail = @"test@gmail.com";
testMsg.toEmail =@"to@gmail.com";
testMsg.relayHost = @"smtp.gmail.com";
testMsg.requiresAuth = YES;
testMsg.login = @"test@gmail.com";
testMsg.pass = @"test";
testMsg.subject = [NSString stringWithCString:"测试" encoding:NSUTF8StringEncoding];
testMsg.bccEmail = @"bcc@gmail.com";
testMsg.wantsSecure = YES; // smtp.gmail.com doesn't work without TLS!
 
// Only do this for self-signed certs!
// testMsg.validateSSLChain = NO;
testMsg.delegate = self;
 
NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/plain",kSKPSMTPPartContentTypeKey,
[NSString stringWithCString:"测试正文" encoding:NSUTF8StringEncoding],kSKPSMTPPartMessageKey,@"8bit",kSKPSMTPPartContentTransferEncodingKey,nil];
 
NSString *vcfPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"vcf"];
NSData *vcfData = [NSData dataWithContentsOfFile:vcfPath];
 
NSDictionary *vcfPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/directory;\r\n\tx-unix-mode=0644;\r\n\tname=\"test.vcf\"",kSKPSMTPPartContentTypeKey,
@"attachment;\r\n\tfilename=\"test.vcf\"",kSKPSMTPPartContentDispositionKey,[vcfData encodeBase64ForData],kSKPSMTPPartMessageKey,@"base64",kSKPSMTPPartContentTransferEncodingKey,nil];
 
testMsg.parts = [NSArray arrayWithObjects:plainPart,vcfPart,nil];
 
[testMsg send];
该类也提供了相应的Delegate方法来让你更好的获知发送的状态.
-(void)messageSent:(SKPSMTPMessage *)message;
-(void)messageFailed:(SKPSMTPMessage *)message error:(NSError *)error;

Deleting all the files in the iPhone sandbox (documents folder)?

http://stackoverflow.com/questions/4793278/deleting-all-the-files-in-the-iphone-sandbox-documents-folder

Is there an easy way to delete all the files(images) I saved in the documents folder of the app?
share|improve this question
    
stackoverflow.com/questions/4792663/… this is a similar question assuming he wants to delete everything in the documents folder, but no solution yet –  Jinah Adam Jan 25 '11 at 12:12
add comment
up vote71down voteaccepted
NSFileManager *fileMgr = [[[NSFileManager alloc] init] autorelease];
NSError *error = nil;
NSArray *directoryContents = [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error];
if (error == nil) {
for (NSString *path in directoryContents) {
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:path];
BOOL removeSuccess
= [fileMgr removeItemAtPath:fullPath error:&error];
if (!removeSuccess) {
// Error handling
...
}
}
} else {
// Error handling
...
}
share|improve this answer
1  
it worked for the most part. but it turns out it removeItemAtPath requires full file path. so i used this NSString *myFilePath = [documentsDir stringByAppendingPathComponent:path]; thanks. –  Jinah Adam Jan 25 '11 at 12:43
1  
That's right, Jinah. My error. I am gonna correct the code above. –  Ole Begemann Jan 25 '11 at 12:45
2  
If this works, it would be nice to remove the Untested code: comment. Thanks –  Warpspace Feb 9 '12 at 8:58
    
I get an EXC_BAD_ACCESS every time I execute this. But it deletes the contents of my sand box though. How do I prevent the error? Any ideas? –  acecapades Aug 10 '12 at 7:50
1  
I got documentsDirectory as undeclared Identifier. using NSDocumentDirectory also does not work in its place. It says, incompatible integer to pointer conversion. –  Ankit Tanna Aug 21 '13 at 8:07
add comment
- (void)removeFile
{
// you need to write a function to get to that directory
NSString *filePath = [self getDirectory];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:filePath])
{
NSError *error;
if (![fileManager removeItemAtPath:filePath error:&error])
{
NSLog(@"Error removing file: %@", error);
};
}
}
I believe this is shorter.
share|improve this answer
    
It appears this only removes a single file or directory –  Warpspace Feb 9 '12 at 8:55
add comment
Code did not work with IOS 7 and Xcode 5 so edited to work with my app. Big credits to @Ole Begemann and @pablasso.
-(void)EmptySandbox
{
NSFileManager *fileMgr = [[NSFileManager alloc] init];
NSError *error = nil;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSArray *files = [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:nil];

while (files.count > 0) {
NSString *documentsDirectory = [paths objectAtIndex:0];
NSArray *directoryContents = [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error];
if (error == nil) {
for (NSString *path in directoryContents) {
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:path];
BOOL removeSuccess
= [fileMgr removeItemAtPath:fullPath error:&error];
files
= [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:nil];
if (!removeSuccess) {
// Error
}
}
} else {
// Error
}
}
}
share|improve this answer
    
If you're using CoreData, just note this will delete your Model also –  BenB Mar 20 at 23:35
add comment
 NSFileManager *fileMgr = [[[NSFileManager alloc] init] autorelease];
NSError *error = nil;
NSArray *directoryContents = [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error];
if (error == nil) {
for (NSString *path in directoryContents) {
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:path];
BOOL removeSuccess
= [fileMgr removeItemAtPath:fullPath error:&error];
if (!removeSuccess) {
// Error handling
...
}
}
} else {
// Error handling
...
}

ios文件和文件夹管理

http://blog.csdn.net/chaoyuan899/article/details/17416677

获得磁盘上最常用文件夹的路径

  我们知道,苹果上的应用程序都是运行在自己的沙盒中的,很少也没有足够的权限跟沙盒外面的文件资源打交道,一般一个应用的文件目录如下:


  想要获得应用目录下的文件夹路径最常用的操作:
NSFileManager类的URLsForDirectory:inDomains: 实例方法允许你在IOS的文件系统中搜索指定的目录,特别是在你应用的沙箱中.此方法有两个参数:

URLsForDirectory: 
此参数是你将要搜索的字典对象.为此参数传递一个NSSearchPath类型的目录字典.我将在稍后详细讨论此参数
inDomains: 
此参数指定你在哪儿搜索给定的目录.此参数必须是一NSSearchDomainMask的枚举值
  假设你要获得你应用的 Document 文件夹路径,你会发现是如此简单:

  1. NSFileManager *fileManager = [[NSFileManager alloc] init];  
  2.    NSArray *urls = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];  
  3.    if ([urls count] > 0) {  
  4.        NSURL *documentsFolder = urls[0];  
  5.        NSLog(@"%@",documentsFolder);  
  6.    }else{  
  7.        NSLog(@"Could not find the Documents folder");  
  8.    }  

  下面是 NSFileManager 类实例方法 URLsForDirectory:inDomains:的所有你可以传递的重要参数值:

URLsForDirectory

      NSLibraryDirectory    标记应用的library文件夹
      NSCachesDirectory   标记caches文件夹,在之前解释说明过
      NSDocumentDirectory   标记document文件夹
inDomains 
      NSUserDomainMask   标记对文件夹路径的搜索在当前用户文件夹下进行.OS X,此文件夹为~/. 
  如果你想获得 tmp 文件夹的路径,请像这样使用 C 函数 NSTemporaryDirectory( );

  1. NSString *tempDirectory = NSTemporaryDirectory();  
  2.         NSLog(@"Temp Directory = %@",tempDirectory);  


  •   对文件进行读写操作 
  1. //写  
  2. -(BOOL)writeText:(NSString *)paramText toPath:(NSString *)paramPath{  
  3.     return [paramText writeToFile:paramPath atomically:YES encoding:NSUTF8StringEncoding error:nil];  
  4. }  

  1. //读  
  2. -(NSString *)readTextFromPath:(NSString *)paramPath{  
  3.     return [[NSString alloc] initWithContentsOfFile:paramPath encoding:NSUTF8StringEncoding error:nil];  
  4. }  

  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.       
  5.     NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"MyFile.txt"];  
  6.     if ([self writeText:@"Hello,World!" toPath:filePath]) {  
  7.         NSString *readText = [self readTextFromPath:filePath];  
  8.         if ([readText length]) {  
  9.             NSLog(@"Text read from disk = %@",readText);  
  10.         }else{  
  11.             NSLog(@"Failed to read the text from disk");  
  12.         }  
  13.     }else{  
  14.         NSLog(@"Failed to write the file");  
  15.     }  
  16. }  


  以数组的形式保持到文件:
  1. NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"MyFile.txt"];  
  2. NSArray *arrayOfNames = @[@"Steve",@"John",@"Aaron"];  
  3. if ([arrayOfNames writeToFile:filePath atomically:YES]) {  
  4.     NSArray *readArray = [[NSArray alloc] initWithContentsOfFile:filePath];  
  5.     if ([readArray count]) {  
  6.         NSLog(@"Read the array back from disk just fine");  
  7.     }else{  
  8.         NSLog(@"Failed to read the array back from disk");  
  9.     }  
  10. }else{  
  11.     NSLog(@"Failed to save the array to disk");  
  12. }  

  NSArray类的实例方法writeToFile:atomiclly只能保存包含如下对象类型的数组: 
  NSString 
  NSDictionary 
  NSArray 
  NSData 
  NSNumber 
  NSDate 
  如果你试图在数组中插入其他的对象,则数据将无法被保存到磁盘。


字典具有和数组类似的进行数据写磁盘及读数据回字典对象的方式.方法名称也完全 相同,且数组的保存规则同样适用于字典

  1. NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"MyFile.txt"];  
  2. NSDictionary *dict = @{@"firstName"@"Aaron",  
  3.                        @"lastName":@"zheng",  
  4.                        @"age":@"21"};  
  5. if ([dict writeToFile:filePath atomically:YES]) {  
  6.     NSDictionary *readDictionary = [[NSDictionary alloc] initWithContentsOfFile:filePath];  
  7.     if ([readDictionary isEqualToDictionary:dict]) {  
  8.         NSLog(@"The file we read is the same one as the one we saved");  
  9.     }else{  
  10.         NSLog(@"Failed to read the dictionary from disk");  
  11.     }  
  12. }else{  
  13.     NSLog(@"Failed to write the dictionay to disk");  
  14. }  



  • 在磁盘中创建一个文件夹:

  1. //在磁盘中创建一个文件夹  
  2. -(void)createDirectory{  
  3.     NSFileManager *fileManager = [[NSFileManager alloc] init];  
  4.     NSString *tempDir = NSTemporaryDirectory();  
  5.     NSString *path = [tempDir stringByAppendingPathComponent:@"images"];  
  6.       
  7.     NSError *error;  
  8.     if ([fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error]) {  
  9.         NSLog(@"Successfully created the directory");  
  10.     }else{  
  11.         NSLog(@"Failed to create the directory , ERROR = %@",error);  
  12.     }  
  13. }  

 上面的 withIntermediateDirectories:YES 参数设置为YES,则在创建最深层文件夹的时候,若父文件夹不存在,系统会直接帮你创建好。

  • 删除文件及文件夹

  1. //删除文件及文件夹  
  2. -(void)removeDir{  
  3.     NSFileManager *fileManager = [[NSFileManager alloc] init];  
  4.     NSString *tempDir = NSTemporaryDirectory();  
  5.     NSString *path = [tempDir stringByAppendingString:@"images"];  
  6.       
  7.     NSError *error;  
  8.     if([fileManager removeItemAtPath:path error:&error] == NO){  
  9.         NSLog(@"Failed to remove path %@, ERROR = %@",path,error);  
  10.     }  
  11.       
  12. }  



好了,就先写到这里吧,,不想写了,有时间在写写关于磁盘中文件的安全处理,附注:文中的示例都是摘自《ios 6 Programming Cookbook》一书,由DevDiv网友自发组织翻译,支持技术和信息的共享!