iOS開發(fā)之文件相關的操作(沙盒目錄抵屿,文件創(chuàng)建、移動捅位、復制等)

前言

在iOS開發(fā)中我們經常會遇到一些關于文件的操作轧葛,比如說:獲取沙盒路徑、創(chuàng)建文件绿渣、刪除文件朝群、向文件內寫入內容等等。為了方便中符,這里做一個總結,以便用到的時候可以方便的使用誉帅。

正文

本文將針對在iOS開發(fā)中涉及到的文件相關的操作做一個總結淀散,主要從以下幾個方面來講解:

  • 獲取沙盒目錄相關路徑
  • 創(chuàng)建文件或文件(夾)
  • 寫入文件內容
  • 刪除文件(夾)
  • 復制文件(夾)
  • 移動文件(夾)
  • 根據URL獲取文件名
  • 判斷文件(夾)是否存在
  • 獲取文件(夾)大小
  • 遍歷文件夾
  • 獲取文件屬性
1、獲取沙盒目錄相關路徑(沙盒文件結構如圖 1-1)
圖1-1 沙盒的結構.png

獲取沙盒的主目錄路徑:

+ (NSString *)homeDir {
    return NSHomeDirectory();
}

獲取沙盒中Documents的目錄路徑:

+ (NSString *)documentsDir {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
}

獲取沙盒中Library的目錄路徑:

+ (NSString *)libraryDir {
    return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
}

獲取沙盒中Libarary/Preferences的目錄路徑:

+ (NSString *)preferencesDir {
    NSString *libraryDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
    return [libraryDir stringByAppendingPathComponent:@"Preferences"];
}

獲取沙盒中Library/Caches的目錄路徑:

+ (NSString *)cachesDir {
    return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
}

獲取沙盒中tmp的目錄路徑:

+ (NSString *)tmpDir {
    return NSTemporaryDirectory();
}
2蚜锨、創(chuàng)建文件(夾)

創(chuàng)建文件夾:

+ (BOOL)createDirectoryAtPath:(NSString *)path error:(NSError *__autoreleasing *)error {
    NSFileManager *manager = [NSFileManager defaultManager];
    /* createDirectoryAtPath:withIntermediateDirectories:attributes:error:
     * 參數(shù)1:創(chuàng)建的文件夾的路徑
     * 參數(shù)2:是否創(chuàng)建媒介的布爾值档插,一般為YES
     * 參數(shù)3: 屬性,沒有就置為nil
     * 參數(shù)4: 錯誤信息
    */
    BOOL isSuccess = [manager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:error];
    return isSuccess;
}

創(chuàng)建文件:

/*創(chuàng)建文件
 *參數(shù)1:文件創(chuàng)建的路徑
 *參數(shù)2:寫入文件的內容
 *參數(shù)3:假如已經存在此文件是否覆蓋
 *參數(shù)4:錯誤信息
 */
+ (BOOL)createFileAtPath:(NSString *)path overwrite:(BOOL)overwrite error:(NSError *__autoreleasing *)error {
    // 如果文件夾路徑不存在亚再,那么先創(chuàng)建文件夾
    NSString *directoryPath = [self directoryAtPath:path];
    if (![self isExistsAtPath:directoryPath]) {
        // 創(chuàng)建文件夾
        if (![self createDirectoryAtPath:directoryPath error:error]) {
            return NO;
        }
    }
    // 如果文件存在郭膛,并不想覆蓋,那么直接返回YES氛悬。
    if (!overwrite) {
        if ([self isExistsAtPath:path]) {
            return YES;
        }
    }
   /*創(chuàng)建文件
    *參數(shù)1:創(chuàng)建文件的路徑
    *參數(shù)2:創(chuàng)建文件的內容(NSData類型)
    *參數(shù)3:文件相關屬性
    */
    BOOL isSuccess = [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];

    return isSuccess;
}

獲取文件創(chuàng)建的時間或者修改的時間:

//獲取文件創(chuàng)建的時間
+ (NSDate *)creationDateOfItemAtPath:(NSString *)path error:(NSError *__autoreleasing *)error {
    return (NSDate *)[self attributeOfItemAtPath:path forKey:NSFileCreationDate error:error];
}

//獲取文件修改的時間
+ (NSDate *)modificationDateOfItemAtPath:(NSString *)path error:(NSError *__autoreleasing *)error {
    return (NSDate *)[self attributeOfItemAtPath:path forKey:NSFileModificationDate error:error];
}
3则剃、寫入文件內容

按照文件路徑向文件寫入內容,內容可為數(shù)組如捅、字典棍现、NSData等等:

#pragma mark 寫入文件內容
/*參數(shù)1:文件路徑
 *參數(shù)2:文件內容
 *參數(shù)3:錯誤信息
 */
+ (BOOL)writeFileAtPath:(NSString *)path content:(NSObject *)content error:(NSError *__autoreleasing *)error {
    //判斷文件內容是否為空
    if (!content) {
        [NSException raise:@"非法的文件內容" format:@"文件內容不能為nil"];
        return NO;
    }
    //判斷文件(夾)是否存在
    if ([self isExistsAtPath:path]) {
        if ([content isKindOfClass:[NSMutableArray class]]) {//文件內容為可變數(shù)組
            [(NSMutableArray *)content writeToFile:path atomically:YES];
        }else if ([content isKindOfClass:[NSArray class]]) {//文件內容為不可變數(shù)組
            [(NSArray *)content writeToFile:path atomically:YES];
        }else if ([content isKindOfClass:[NSMutableData class]]) {//文件內容為可變NSMutableData
            [(NSMutableData *)content writeToFile:path atomically:YES];
        }else if ([content isKindOfClass:[NSData class]]) {//文件內容為NSData
            [(NSData *)content writeToFile:path atomically:YES];
        }else if ([content isKindOfClass:[NSMutableDictionary class]]) {//文件內容為可變字典
            [(NSMutableDictionary *)content writeToFile:path atomically:YES];
        }else if ([content isKindOfClass:[NSDictionary class]]) {//文件內容為不可變字典
            [(NSDictionary *)content writeToFile:path atomically:YES];
        }else if ([content isKindOfClass:[NSJSONSerialization class]]) {//文件內容為JSON類型
            [(NSDictionary *)content writeToFile:path atomically:YES];
        }else if ([content isKindOfClass:[NSMutableString class]]) {//文件內容為可變字符串
            [[((NSString *)content) dataUsingEncoding:NSUTF8StringEncoding] writeToFile:path atomically:YES];
        }else if ([content isKindOfClass:[NSString class]]) {//文件內容為不可變字符串
            [[((NSString *)content) dataUsingEncoding:NSUTF8StringEncoding] writeToFile:path atomically:YES];
        }else if ([content isKindOfClass:[UIImage class]]) {//文件內容為圖片
            [UIImagePNGRepresentation((UIImage *)content) writeToFile:path atomically:YES];
        }else if ([content conformsToProtocol:@protocol(NSCoding)]) {//文件歸檔
            [NSKeyedArchiver archiveRootObject:content toFile:path];
        }else {
            [NSException raise:@"非法的文件內容" format:@"文件類型%@異常,無法被處理镜遣。", NSStringFromClass([content class])];
            
            return NO;
        }
    }else {
        return NO;
    }
    return YES;
}
#pragma mark - 判斷文件(夾)是否存在
+ (BOOL)isExistsAtPath:(NSString *)path {
    return [[NSFileManager defaultManager] fileExistsAtPath:path];
}
4己肮、刪除文件(夾)

刪除文件(夾):

+ (BOOL)removeItemAtPath:(NSString *)path error:(NSError *__autoreleasing *)error {
    return [[NSFileManager defaultManager] removeItemAtPath:path error:error];
}

清空Caches或者temp文件夾:

#pragma mark 清空Cashes文件夾
+ (BOOL)clearCachesDirectory {
    NSArray *subFiles = [self listFilesInCachesDirectoryByDeep:NO];
    BOOL isSuccess = YES;
    
    for (NSString *file in subFiles) {
        NSString *absolutePath = [[self cachesDir] stringByAppendingPathComponent:file];
        isSuccess &= [self removeItemAtPath:absolutePath];
    }
    return isSuccess;
}
#pragma mark 清空temp文件夾
+ (BOOL)clearTmpDirectory {
    NSArray *subFiles = [self listFilesInTmpDirectoryByDeep:NO];
    BOOL isSuccess = YES;
    
    for (NSString *file in subFiles) {
        NSString *absolutePath = [[self tmpDir] stringByAppendingPathComponent:file];
        isSuccess &= [self removeItemAtPath:absolutePath];
    }
    return isSuccess;
}
5、復制文件(夾)

依據源文件的路徑復制一份到目標路徑:

#pragma mark - 復制文件
/*參數(shù)1悲关、被復制文件路徑
 *參數(shù)2谎僻、要復制到的目標文件路徑
 *參數(shù)3、當要復制到的文件路徑文件存在寓辱,會復制失敗艘绍,這里傳入是否覆蓋
 *參數(shù)4、錯誤信息
 */
+ (BOOL)copyItemAtPath:(NSString *)path toPath:(NSString *)toPath overwrite:(BOOL)overwrite error:(NSError *__autoreleasing *)error {
    // 先要保證源文件路徑存在讶舰,不然拋出異常
    if (![self isExistsAtPath:path]) {
        [NSException raise:@"非法的源文件路徑" format:@"源文件路徑%@不存在鞍盗,請檢查源文件路徑", path];
        return NO;
    }
    //獲得目標文件的上級目錄
    NSString *toDirPath = [self directoryAtPath:toPath];
    if (![self isExistsAtPath:toDirPath]) {
        // 創(chuàng)建復制路徑
        if (![self createDirectoryAtPath:toDirPath error:error]) {
            return NO;
        }
    }
    // 如果覆蓋需了,那么先刪掉原文件
    if (overwrite) {
        if ([self isExistsAtPath:toPath]) {
            [self removeItemAtPath:toPath error:error];
        }
    }
    // 復制文件,如果不覆蓋且文件已存在則會復制失敗
    BOOL isSuccess = [[NSFileManager defaultManager] copyItemAtPath:path toPath:toPath error:error];
    
    return isSuccess;
}

#pragma mark - 判斷文件(夾)是否存在
+ (BOOL)isExistsAtPath:(NSString *)path {
    return [[NSFileManager defaultManager] fileExistsAtPath:path];
}
6般甲、 移動文件(夾)

依據源文件的路徑移動到目標路徑:

#pragma mark - 移動文件(夾)
/*參數(shù)1肋乍、被移動文件路徑
 *參數(shù)2、要移動到的目標文件路徑
 *參數(shù)3敷存、當要移動到的文件路徑文件存在墓造,會移動失敗,這里傳入是否覆蓋
 *參數(shù)4锚烦、錯誤信息
 */
+ (BOOL)moveItemAtPath:(NSString *)path toPath:(NSString *)toPath overwrite:(BOOL)overwrite error:(NSError *__autoreleasing *)error {
    // 先要保證源文件路徑存在觅闽,不然拋出異常
    if (![self isExistsAtPath:path]) {
        [NSException raise:@"非法的源文件路徑" format:@"源文件路徑%@不存在,請檢查源文件路徑", path];
        return NO;
    }
    //獲得目標文件的上級目錄
    NSString *toDirPath = [self directoryAtPath:toPath];
    if (![self isExistsAtPath:toDirPath]) {
        // 創(chuàng)建移動路徑
        if (![self createDirectoryAtPath:toDirPath error:error]) {
            return NO;
        }
    }
    // 判斷目標路徑文件是否存在
    if ([self isExistsAtPath:toPath]) {
        //如果覆蓋涮俄,刪除目標路徑文件
        if (overwrite) {
            //刪掉目標路徑文件
            [self removeItemAtPath:toPath error:error];
        }else {
           //刪掉被移動文件
            [self removeItemAtPath:path error:error];
            return YES;
        }
    }
    
    // 移動文件蛉拙,當要移動到的文件路徑文件存在,會移動失敗
    BOOL isSuccess = [[NSFileManager defaultManager] moveItemAtPath:path toPath:toPath error:error];
    
    return isSuccess;
}
7彻亲、根據URL獲取文件名

根據文件路徑獲取文件名稱孕锄,是否需要后綴:

#pragma mark - 根據URL獲取文件名
/*參數(shù)1:文件路徑
 *參數(shù)2、是否需要后綴
 */
+ (NSString *)fileNameAtPath:(NSString *)path suffix:(BOOL)suffix {
    NSString *fileName = [path lastPathComponent];
    if (!suffix) {
        fileName = [fileName stringByDeletingPathExtension];
    }
    return fileName;
}

獲取文件所在的文件夾路徑:

+ (NSString *)directoryAtPath:(NSString *)path {
    return [path stringByDeletingLastPathComponent];
}

根據文件路徑獲取文件擴展類型:

+ (NSString *)suffixAtPath:(NSString *)path {
    return [path pathExtension];
}
8苞尝、判斷文件(夾)是否存在

判斷文件路徑是否存在:

+ (BOOL)isExistsAtPath:(NSString *)path {
    return [[NSFileManager defaultManager] fileExistsAtPath:path];
}

判斷路徑是否為空(判空條件是文件大小為0畸肆,或者是文件夾下沒有子文件):

+ (BOOL)isEmptyItemAtPath:(NSString *)path error:(NSError *__autoreleasing *)error {
    return ([self isFileAtPath:path error:error] &&
            [[self sizeOfItemAtPath:path error:error] intValue] == 0) ||
    ([self isDirectoryAtPath:path error:error] &&
     [[self listFilesInDirectoryAtPath:path deep:NO] count] == 0);
}

判斷目錄是否是文件夾:

+ (BOOL)isDirectoryAtPath:(NSString *)path error:(NSError *__autoreleasing *)error {
    return ([self attributeOfItemAtPath:path forKey:NSFileType error:error] == NSFileTypeDirectory);
}

判斷目錄是否是文件:

+ (BOOL)isFileAtPath:(NSString *)path error:(NSError *__autoreleasing *)error {
    return ([self attributeOfItemAtPath:path forKey:NSFileType error:error] == NSFileTypeRegular);
}

判斷目錄是否可以執(zhí)行:

+ (BOOL)isExecutableItemAtPath:(NSString *)path {
    return [[NSFileManager defaultManager] isExecutableFileAtPath:path];
}

判斷目錄是否可讀:

+ (BOOL)isReadableItemAtPath:(NSString *)path {
    return [[NSFileManager defaultManager] isReadableFileAtPath:path];
}

判斷目錄是否可寫:

+ (BOOL)isWritableItemAtPath:(NSString *)path {
    return [[NSFileManager defaultManager] isWritableFileAtPath:path];
}
9、獲取文件(夾)大小

獲取文件大兄嬷贰(NSNumber):

+ (NSNumber *)sizeOfItemAtPath:(NSString *)path error:(NSError *__autoreleasing *)error {
    return (NSNumber *)[self attributeOfItemAtPath:path forKey:NSFileSize error:error];
}

獲取文件夾大兄崞辍(NSNumber):

#pragma mark 獲取文件夾的大小
+ (NSNumber *)sizeOfDirectoryAtPath:(NSString *)path error:(NSError *__autoreleasing *)error {
    if ([self isDirectoryAtPath:path error:error]) {
       //深遍歷文件夾
        NSArray *subPaths = [self listFilesInDirectoryAtPath:path deep:YES];
        NSEnumerator *contentsEnumurator = [subPaths objectEnumerator];
        
        NSString *file;
        unsigned long long int folderSize = 0;
        
        while (file = [contentsEnumurator nextObject]) {
            NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[path stringByAppendingPathComponent:file] error:nil];
            folderSize += [[fileAttributes objectForKey:NSFileSize] intValue];
        }
        return [NSNumber numberWithUnsignedLongLong:folderSize];
    }
    return nil;
}

獲取文件大小(單位為字節(jié)):

+ (NSString *)sizeFormattedOfItemAtPath:(NSString *)path error:(NSError *__autoreleasing *)error {
    //先獲取NSNumber類型的大小
    NSNumber *size = [self sizeOfItemAtPath:path error:error];
    if (size) {
       //將文件大小格式化為字節(jié)
        return [self sizeFormatted:size];
    }
    return nil;
}

#pragma mark 將文件大小格式化為字節(jié)
+(NSString *)sizeFormatted:(NSNumber *)size {
    /*NSByteCountFormatterCountStyle枚舉
     *NSByteCountFormatterCountStyleFile 字節(jié)為單位抡砂,采用十進制的1000bytes = 1KB
     *NSByteCountFormatterCountStyleMemory 字節(jié)為單位大咱,采用二進制的1024bytes = 1KB
     *NSByteCountFormatterCountStyleDecimal KB為單位,采用十進制的1000bytes = 1KB
     *NSByteCountFormatterCountStyleBinary KB為單位舀患,采用二進制的1024bytes = 1KB
     */
    return [NSByteCountFormatter stringFromByteCount:[size unsignedLongLongValue] countStyle:NSByteCountFormatterCountStyleFile];
}

獲取文件夾大谢占丁(單位為字節(jié)):

+ (NSString *)sizeFormattedOfDirectoryAtPath:(NSString *)path error:(NSError *__autoreleasing *)error {
    //先獲取NSNumber類型的大小
    NSNumber *size = [self sizeOfDirectoryAtPath:path error:error];
    if (size) {
        return [self sizeFormatted:size];
    }
    return nil;
}
#pragma mark 將文件大小格式化為字節(jié)
+(NSString *)sizeFormatted:(NSNumber *)size {
    /*NSByteCountFormatterCountStyle枚舉
     *NSByteCountFormatterCountStyleFile 字節(jié)為單位,采用十進制的1000bytes = 1KB
     *NSByteCountFormatterCountStyleMemory 字節(jié)為單位聊浅,采用二進制的1024bytes = 1KB
     *NSByteCountFormatterCountStyleDecimal KB為單位餐抢,采用十進制的1000bytes = 1KB
     *NSByteCountFormatterCountStyleBinary KB為單位,采用二進制的1024bytes = 1KB
     */
    return [NSByteCountFormatter stringFromByteCount:[size unsignedLongLongValue] countStyle:NSByteCountFormatterCountStyleFile];
}
10低匙、遍歷文件夾

遍歷文件夾旷痕,分為深遍歷和淺遍歷:

#pragma mark - 遍歷文件夾
/**
 文件遍歷
 參數(shù)1:目錄的絕對路徑
 參數(shù)2:是否深遍歷 (1. 淺遍歷:返回當前目錄下的所有文件和文件夾;
 2. 深遍歷:返回當前目錄下及子目錄下的所有文件和文件夾)
 */
+ (NSArray *)listFilesInDirectoryAtPath:(NSString *)path deep:(BOOL)deep {
    NSArray *listArr;
    NSError *error;
    NSFileManager *manager = [NSFileManager defaultManager];
    if (deep) {
        // 深遍歷
        NSArray *deepArr = [manager subpathsOfDirectoryAtPath:path error:&error];
        if (!error) {
            listArr = deepArr;
        }else {
            listArr = nil;
        }
    }else {
        // 淺遍歷
        NSArray *shallowArr = [manager contentsOfDirectoryAtPath:path error:&error];
        if (!error) {
            listArr = shallowArr;
        }else {
            listArr = nil;
        }
    }
    return listArr;
}

11顽冶、獲取文件屬性

根據key獲取文件某個屬性:

//key的列表如:
FOUNDATION_EXPORT NSString * const NSFileType;
FOUNDATION_EXPORT NSString * const NSFileTypeDirectory;
FOUNDATION_EXPORT NSString * const NSFileTypeRegular;
FOUNDATION_EXPORT NSString * const NSFileTypeSymbolicLink;
FOUNDATION_EXPORT NSString * const NSFileTypeSocket;
FOUNDATION_EXPORT NSString * const NSFileTypeCharacterSpecial;
FOUNDATION_EXPORT NSString * const NSFileTypeBlockSpecial;
FOUNDATION_EXPORT NSString * const NSFileTypeUnknown;
FOUNDATION_EXPORT NSString * const NSFileSize;
FOUNDATION_EXPORT NSString * const NSFileModificationDate;
FOUNDATION_EXPORT NSString * const NSFileReferenceCount;
FOUNDATION_EXPORT NSString * const NSFileDeviceIdentifier;
FOUNDATION_EXPORT NSString * const NSFileOwnerAccountName;
FOUNDATION_EXPORT NSString * const NSFileGroupOwnerAccountName;
FOUNDATION_EXPORT NSString * const NSFilePosixPermissions;
FOUNDATION_EXPORT NSString * const NSFileSystemNumber;
FOUNDATION_EXPORT NSString * const NSFileSystemFileNumber;
FOUNDATION_EXPORT NSString * const NSFileExtensionHidden;
FOUNDATION_EXPORT NSString * const NSFileHFSCreatorCode;
FOUNDATION_EXPORT NSString * const NSFileHFSTypeCode;
FOUNDATION_EXPORT NSString * const NSFileImmutable;
FOUNDATION_EXPORT NSString * const NSFileAppendOnly;
FOUNDATION_EXPORT NSString * const NSFileCreationDate;
FOUNDATION_EXPORT NSString * const NSFileOwnerAccountID;
FOUNDATION_EXPORT NSString * const NSFileGroupOwnerAccountID;
FOUNDATION_EXPORT NSString * const NSFileBusy;
FOUNDATION_EXPORT NSString * const NSFileProtectionKey NS_AVAILABLE_IOS(4_0);
FOUNDATION_EXPORT NSString * const NSFileProtectionNone NS_AVAILABLE_IOS(4_0);
FOUNDATION_EXPORT NSString * const NSFileProtectionComplete NS_AVAILABLE_IOS(4_0);
FOUNDATION_EXPORT NSString * const NSFileProtectionCompleteUnlessOpen NS_AVAILABLE_IOS(5_0);
FOUNDATION_EXPORT NSString * const NSFileProtectionCompleteUntilFirstUserAuthentication NS_AVAILABLE_IOS(5_0);
+ (id)attributeOfItemAtPath:(NSString *)path forKey:(NSString *)key error:(NSError *__autoreleasing *)error {
    return [[self attributesOfItemAtPath:path error:error] objectForKey:key];
}

獲取文件屬性集合:

+ (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError *__autoreleasing *)error {
    return [[NSFileManager defaultManager] attributesOfItemAtPath:path error:error];
}

源碼已上傳至fenglinyunshi-git欺抗,歡迎下載,并提出寶貴意見强重。

結語:

本篇詳細的講解了iOS開發(fā)中所可能涉及到的有關文件或者文件夾相關的操作绞呈,比如:沙盒路徑的獲取贸人、文件創(chuàng)建、文件刪除佃声、復制艺智、移動等等操作。本篇所屬的具體的代碼實現(xiàn)存在很多函數(shù)建相互調用的情況圾亏,還請閱讀時了解十拣。對于上面關于文件的所有操作封裝了一個工具類,已上傳git歡迎下載使用志鹃。

生命哪夭问,并不是你活了多少日子,而是你記住了多少日子曹铃,要使你過的每一天都值得回憶缰趋。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市陕见,隨后出現(xiàn)的幾起案子埠胖,更是在濱河造成了極大的恐慌,老刑警劉巖淳玩,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異非竿,居然都是意外死亡蜕着,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門红柱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來承匣,“玉大人,你說我怎么就攤上這事锤悄∪推” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵零聚,是天一觀的道長袍暴。 經常有香客問我,道長隶症,這世上最難降的妖魔是什么政模? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮蚂会,結果婚禮上淋样,老公的妹妹穿的比我還像新娘。我一直安慰自己胁住,他們只是感情好趁猴,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布刊咳。 她就那樣靜靜地躺著,像睡著了一般儡司。 火紅的嫁衣襯著肌膚如雪娱挨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天枫慷,我揣著相機與錄音让蕾,去河邊找鬼。 笑死或听,一個胖子當著我的面吹牛探孝,可吹牛的內容都是我干的。 我是一名探鬼主播誉裆,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼顿颅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了足丢?” 一聲冷哼從身側響起粱腻,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎斩跌,沒想到半個月后绍些,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡耀鸦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年柬批,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袖订。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡氮帐,死狀恐怖,靈堂內的尸體忽然破棺而出洛姑,到底是詐尸還是另有隱情上沐,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布楞艾,位于F島的核電站参咙,受9級特大地震影響,放射性物質發(fā)生泄漏产徊。R本人自食惡果不足惜昂勒,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舟铜。 院中可真熱鬧戈盈,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刁岸,卻和暖如春脏里,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虹曙。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工迫横, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酝碳。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓矾踱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疏哗。 傳聞我的和親對象是個殘疾皇子呛讲,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內容