java語言實現操作系統中的文件管理系統

123.jpg
123.jpg

Basic Framework

屏幕快照 2017-12-08 11.38.25.png
屏幕快照 2017-12-08 11.38.25.png

fileModel.java

package File_System_Structure;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class fileModel {
//fileModel類用來記錄文件或目錄的相關屬性

    public Map<String, fileModel> subMap = new HashMap<String, fileModel>();
    private String name; //文件名或目錄名
    private String type; //文件類型
    private int attr; //用來識別是文件還是目錄 
    private int startNum;   //在FAT表中起始位置
    private int size;   //文件的大小
    private fileModel father = null;    //該文件或目錄的上級目錄
    
    public fileModel( String name, String type, int startNum, int size ){
        this.name = name;
        this.type = type;
        this.attr = 2;
        this.startNum = startNum;
        this.size = size;       
    }
    
    public fileModel( String name, int startNum ) {
        this.name = name;
        this.attr = 3;
        this.startNum = startNum;
        this.type = "  ";
        this.size = 1;
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public int getAttr() {
        return attr;
    }
    public void setAttr(int attr) {
        this.attr = attr;
    }
    public int getStartNum() {
        return startNum;
    }
    public void setStartNum(int startNum) {
        this.startNum = startNum;
    }
    public int getSize() {
        return size;
    }
    public void setSize(int size) {
        this.size = size;
    }

    public fileModel getFather() {
        return father;
    }

    public void setFather(fileModel father) {
        this.father = father;
    }

}

OSManager.java

package File_System_Structure;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

public class OSManager {
    //OSManager這個類實現對文件的各種操作

    public Map<String, fileModel> totalFiles = new HashMap<String, fileModel>();
    //定義FAT表
    private int[] fat = new int[128]; 
    //創(chuàng)建根目錄 使用fat表的第一項
    private fileModel root = new fileModel("root", 1);
    private fileModel nowCatalog = root;
    
    public OSManager() {
        //將FAT表初始化全部為0,并將第一位設為根目錄的空間
        for( int i = 0; i < fat.length ; i++ ) {
            fat[i] = 0;
        }
        fat[ 1 ] = 255; //255表示磁盤塊已占用
        fat[ 0 ] = 126; //紀錄磁盤剩余塊數  
        root.setFather( root );
        totalFiles.put( "root", root );
    }
    
    public int setFat(int size) {
        int[] startNum = new int[128];
        int i = 2; //紀錄fat循環(huán)定位
        for( int j = 0; j < size; i++ ) {
            if( fat[ i ] == 0 ) {
                startNum[ j ] = i; //紀錄該文件所有磁盤塊
                if( j > 0 ) {
                    fat[ startNum[ j-1 ] ] = i; //fat上一磁盤塊指向下一磁盤塊地址
                }
                j++;
            }
        }
        fat[ i-1 ] = 255;
        return startNum[ 0 ]; //返回該文件起始塊盤號
    }


    /*
     * 
     * 該方法用于刪除時釋放FAT表的空間
     */
    public void deleteFAT( int startNum ) {
        int nextPoint = fat[ startNum ];
        int nowPoint = startNum;
        int count = 0;
        while( fat[nowPoint ] != 0 ) {
            nextPoint = fat[ nowPoint ];
            if( nextPoint == 255 ) {
                fat[ nowPoint ] =0;
                count++;
                break;
            } else {
                fat[ nowPoint ] = 0;
                count++;
                nowPoint = nextPoint;
            }
        }
        fat[0] += count;
    }
    

    /*
     * 
     * 以下為追加內容時修改fat表
     * 
     */
    public void AddFAT(int startNum, int addSize) {
        int nowPoint = startNum;
        int nextPoint = fat[startNum];
        while( fat[ nowPoint ] != 255 ) {
            nowPoint = nextPoint;
            nextPoint = fat[ nowPoint ];
        }//找到該文件終結盤塊

        for( int i = 2, count = 0; count < addSize; i++ ) {
            if( fat[ i ] == 0 ) {
                fat[ nowPoint ] = i;
                nowPoint = i;
                count++;
                fat[ nowPoint ] = 255;//作為當前文件終結盤塊
            }
        }
    }
    
    /*
     *  以下為創(chuàng)建文件和目錄方法
     * 
     */
    public void createFile( String name, String type, int size ) {
        
        if( fat[ 0 ] >= size ) {    //判斷磁盤剩余空間是否足夠建立文件
            fileModel value = nowCatalog.subMap.get( name ); //該目錄下是否尋找同名目錄或文件
            if( value != null ) {  //判斷該文件是否存在
                if( value.getAttr() == 3 ) {   //若存在同名目錄 繼續(xù)創(chuàng)建文件
                    int startNum = setFat( size ); 
                    fileModel file = new fileModel( name, type, startNum, size );
                    file.setFather( nowCatalog ); //紀錄上一層目錄
                    nowCatalog.subMap.put( name, file ); //在父目錄添加該文件
                    totalFiles.put( file.getName(), file );
                    fat[ 0 ] -= size;
                    System.out.println( "File is successfully created!" );
                    showFile();
                } else if( value.getAttr() == 2 ) { //若同名文件已存在,創(chuàng)建失敗
                    System.out.println("File fails to create because the file already exists"); 
                    showFile();
                }
            } else if( value == null ) { //若無同名文件或文件夾,繼續(xù)創(chuàng)建文件
                int startNum = setFat( size ); 
                fileModel file = new fileModel( name, type, startNum, size );
                file.setFather( nowCatalog ); //紀錄上一層目錄
                nowCatalog.subMap.put( name, file ); //在父目錄添加該文件
                totalFiles.put( file.getName(), file );
                fat[0] -= size;
                System.out.println( "File is successfully created!");
                showFile();
                }
        } else {
            System.out.println("File fails to create because insufficient disk space!");
        }
    
    }
    
    public void createCatolog( String name ) {
        
        if( fat[ 0 ] >= 1 ) { //判斷磁盤空間是否足夠創(chuàng)建文件夾
            
            fileModel value = nowCatalog.subMap.get( name ); //判斷該目錄下是否存在同名目錄或文件
            if( value != null ) {
                if( value.getAttr() == 2 ) {
                    int startNum = setFat( 1 );
                    fileModel catalog = new fileModel( name, startNum );
                    catalog.setFather( nowCatalog ); //紀錄上一層目錄
                    nowCatalog.subMap.put( name, catalog );
                    fat[ 0 ]--;
                    totalFiles.put( catalog.getName(), catalog );
                    System.out.println( "Directory is successfully created!" );
                    showFile();
                } 
                else if(value.getAttr() == 3) {
                    System.out.println( "Directory fails to create because the directory already exists!" );
                    showFile();
                } 
            } 
            else if(value == null) {
                int startNum = setFat(1);
                fileModel catalog = new fileModel( name, startNum );
                catalog.setFather( nowCatalog ); //紀錄上一層目錄
                nowCatalog.subMap.put( name, catalog );
                fat[ 0 ]--;
                totalFiles.put( catalog.getName(), catalog );
                System.out.println( "Directory is successfully created!" );
                showFile();
            }           
        } 
        else {
            System.out.println("Directory fails to create because insufficient disk space!");
        }
    }
    
    
    /*
     * 
     * 以下為顯示該目錄下的所有文件信息
     * 
     */
    public void showFile() {
        System.out.println("***************** < " + nowCatalog.getName() + " > *****************");
       
        if( !nowCatalog.subMap.isEmpty() ) {
            for( fileModel value : nowCatalog.subMap.values() ) {
                if(value.getAttr() == 3) { //目錄文件
                    System.out.println("File Name:" + value.getName());
                    System.out.println("Operation Type:" + "Folder");
                    System.out.println("Starting Disk Blocks:" + value.getStartNum());
                    System.out.println("Size: " + value.getSize());
                    System.out.println("<-------------------------------------->");
                }
                else if(value.getAttr() == 2) {
                    System.out.println("File Name:" + value.getName() + "." + value.getType());
                    System.out.println("Operation Type: " + "Readable & Writable File");
                    System.out.println("Starting Disk Blocks:" + value.getStartNum());
                    System.out.println("Size:" + value.getSize());
                    System.out.println("<-------------------------------------->");
                }
            }
        }
        for(int i =0; i<2; i++) 
        System.out.println();
        System.out.println("Disk Surplus Space:" + fat[ 0 ] + "            " + "Exit the system please enter:exit");
        System.out.println();
    }

    /*
     * 
     * 以下為刪除該目錄下某個文件
     * 
     */
    public void deleteFile(String name) {
        
        fileModel value = nowCatalog.subMap.get( name );
        if( value == null ) {
            System.out.println("Delete failed, No File or Folder!!");
        } 
        else if( !value.subMap.isEmpty() ){
            System.out.println("Delete failed because the folder contains files!");
        } 
        else {
            nowCatalog.subMap.remove(name);
            deleteFAT(value.getStartNum());
            if(value.getAttr() == 3) {
                System.out.println("Folder " + value.getName() + " Have been successfully deleted");
                showFile();
            } 
            else if(value.getAttr() == 2) {
                System.out.println("File " + value.getName() + "Have been successfully deleted");
                showFile();
            }
        }
    }
    
    /*
     * 
     * 以下為文件或文件夾重命名方法
     * 
     */
    public void reName(String name, String newName) {
        if( nowCatalog.subMap.containsKey(name) ) {
            if( nowCatalog.subMap.containsKey( newName ) ) {
                System.out.println("Rename failed because the same name file already exists!"); 
                showFile();
            } 
            else {
                fileModel value = nowCatalog.subMap.get( name );
                value.setName( newName );
                nowCatalog.subMap.remove( name );
                nowCatalog.subMap.put( newName, value );
                System.out.println( "Rename has succeed" );
                System.out.println();
                showFile();
            }
        } 
        else {
            System.out.println("Rename failed because there is no this file");
            showFile();
        }
    }
    
    /*
     * 
     * 以下為修改文件類型
     * 修改類型需要打開文件后才能操作
     */
    public void changeType( String name, String type ) {
        
        nowCatalog = nowCatalog.getFather();
        if( nowCatalog.subMap.containsKey( name ) ) {
            fileModel value = nowCatalog.subMap.get( name );
            if(value.getAttr() == 2){
                value.setType(type);
                nowCatalog.subMap.remove(name);
                nowCatalog.subMap.put(name, value);
                System.out.println("Modify type success!");
                showFile();
            } 
            else if(value.getAttr() == 3) {
                System.out.println("Change error because the folder can not modify type!!");
                openFile( value.getName() );
            }
        } 
        else {
            System.out.println("Modify error, please check whether the input file name is correct!");
        }
    }
    
    /*
     * 以下為打開文件或文件夾方法
     * 
     */
    public void openFile( String name ) {
        if( nowCatalog.subMap.containsKey( name ) ) {
            fileModel value = nowCatalog.subMap.get(name);
            if(value.getAttr() == 2) {
                nowCatalog = value;
                System.out.println("The file has been opened and the file size is: " + value.getSize() );               
            }
            else if(value.getAttr() == 3) {
                nowCatalog = value;
                System.out.println("The file has been opened!");
                showFile();
            }
        } 
        else{
            System.out.println("Open failed because the file does not exist!");
        }
    }
    

    /*
     * 
     * 以下為向文件追加內容方法
     * 追加內容需要打開文件后才能操作
     */
    public void reAdd(String name, int addSize){
        if( fat[0] >= addSize ) {
            nowCatalog = nowCatalog.getFather();
            if(nowCatalog.subMap.containsKey(name)) {
                fileModel value = nowCatalog.subMap.get(name);
                if(value.getAttr() == 2) {
                    value.setSize(value.getSize() + addSize);
                    AddFAT(value.getStartNum(), addSize);
                    System.out.println("Addition content is successful! The file is being reopened...");
                    openFile(name);
                } 
                else{
                    System.out.println("The appended content failed, please verify that the filename is entered correctly.");                   
                }
            }
        }
        else{
            System.out.println("Addition content is failed because insufficient memory space");
            }
        }
    
    
    /*
     * 
     * 以下為返回上一層目錄
     * 
     */
    public void backFile() {
        if(nowCatalog.getFather() == null) {
            System.out.println("The document does not have a superior directory!");
        } else {
            nowCatalog = nowCatalog.getFather();
            showFile();
        }
    }
    
    /*
     * 以下根據絕對路徑尋找文件
     * 
     */
    public void searchFile(String[] roadName) {
        
        fileModel theCatalog = nowCatalog; //設置斷點紀錄當前目錄
        
        if( totalFiles.containsKey(roadName[roadName.length-1]) ) { //檢查所有文件中有無該文件
            nowCatalog = root; //返回根目錄
            if( nowCatalog.getName().equals( roadName[0]) ) {   //判斷輸入路徑的首目錄是否root
                System.out.println("yes");
                for( int i = 1; i < roadName.length; i++ ) {
                    if( nowCatalog.subMap.containsKey( roadName[ i ] ) ) {
                        nowCatalog = nowCatalog.subMap.get( roadName[ i ] ); //一級一級往下查

                    } 
                    else {
                        System.out.println("Can't find the file or directory under this path, please check whether the path is correct!");
                        nowCatalog = theCatalog;
                        showFile();
                        break;
                    }
                }
                if( roadName.length > 1 ){
                    nowCatalog = nowCatalog.getFather(); //返回文件上一級目錄 
                    showFile();
                }
            } 
            else{
                nowCatalog = theCatalog;
                System.out.println("Please enter the correct absolute path!");
                showFile();
            }
        } 
        else{
            System.out.println("This file or directory does not exist, please enter the correct absolute path!");
            showFile();
        }
    }
    
    /*
     * 以下為打印FAT表內容
     * 
     */
    public void showFAT() {

        for(int j=0; j<125; j+=5) {
            System.out.println("第幾項 | " + j + "        " + (j+1) + "        " + (j+2) + "        "
                    + (j+3) + "        " + (j+4));
            System.out.println("內容 | " + fat[j] + "        " + fat[j+1] + "        " + fat[j+2]
                     + "        " + fat[j+3] + "        " + fat[j+4]);
            System.out.println();
        }
        int j = 125;
        System.out.println("第幾項 | " + j + "        " + (j+1) + "        " + (j+2));
        System.out.println("內容 | " + fat[j] + "        " + fat[j+1] + "        " + fat[j+2]);
        System.out.println();
        showFile();
    }
}

testFileSystem.java

package File_System_Structure;

import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class testFileSystem {
    public static void main(String[] args) {
        try{
            OSManager manager = new OSManager();
            meun(manager);
            }
        catch (Exception e){
            e.printStackTrace();
        }
    }

    public static void meun(OSManager manager) {
        Scanner s = new Scanner(System.in);
        String str = null;
        System.out.println("***********" + "Welcome to use the file simulation operating system" + "***********");
        System.out.println();
        manager.showFile();

        System.out.println("Please enter command line(Enter help to view the command table):");
        while ((str = s.nextLine()) != null) {
            if (str.equals("exit")) {
                System.out.println("Thank you!");
                break;
            }

            String[] strs = editStr(str);
            switch (strs[0]) {
            case "createFile":
                if (strs.length < 4) {
                    System.out.println("The command you have entered is incorrect. Please check it.");
                } 
                else {
                    manager.createFile(strs[1], strs[2],
                            Integer.parseInt(strs[3]));
                    }
                break;
            case "createCatalog":
                if (strs.length < 2) {
                    System.out.println("The command you have entered is incorrect. Please check it.");
                } 
                else {
                    manager.createCatolog(strs[1]);
                    }
                break;
            case "open":
                if (strs.length < 2) {
                    System.out.println("The command you have entered is incorrect. Please check it.");
                } 
                else {
                    manager.openFile(strs[1]);
                    }
                break;
            case "cd":
                if (strs.length < 2) {
                    System.out.println("The command you have entered is incorrect. Please check it.");
                } 
                else {
                    manager.openFile(strs[1]);
                    }
                break;
            case "cd..":
                manager.backFile();
                break;
            case "delete":
                if (strs.length < 2) {
                    System.out.println("The command you have entered is incorrect. Please check it.");
                } 
                else {
                    manager.deleteFile(strs[1]);
                    }
                break;
            case "rename":
                if (strs.length < 3) {
                    System.out.println("The command you have entered is incorrect. Please check it.");
                } 
                else {
                    manager.reName(strs[1], strs[2]);
                    }
                break;
            case "search": {
                if (strs.length < 2) {
                    System.out.println("The command you have entered is incorrect. Please check it.");
                } 
                else {
                    String[] roadName = strs[1].split("/");
                    manager.searchFile(roadName);
                    }
                break;
            }
            case "showFAT":
                manager.showFAT();
                break;
            case "addContents":
                if (strs.length < 3) {
                    System.out.println("The command you have entered is incorrect. Please check it.");
                } 
                else {
                    manager.reAdd(strs[1], Integer.parseInt(strs[2]));
                    }
                break;
            case "changeType":
                if (strs.length < 3) {
                    System.out.println("The command you have entered is incorrect. Please check it.");
                } else {
                    manager.changeType(strs[1], strs[2]);
                }
                break;
            case "help": {
                System.out.println("The commands are as follows(Space cannot be omitted):");
                System.out
                        .println("createFile FileName fileType fileSize");
                System.out.println("<Create a file, for instance:createFile PUSU txt 5 >");
                System.out.println();
                System.out
                        .println("createCatalog FatalogName");
                System.out.println("<Create a directory, for instance:createCatalog myFile >");
                System.out.println();
                System.out
                        .println("open Name.FileTypt");
                System.out.println("<Open a file, for instance:open PUSU.txt >");
                System.out.println();
                System.out.println("cd CatalogName");
                System.out.println("<Open a directory, for instance: cd myFile >");
                System.out.println();
                System.out.println("cd..");
                System.out.println("<Return to the superior directory, for instance: cd..");
                System.out.println();
                System.out
                        .println("delete FileName/CatalogName");
                System.out.println("<Delete a files or a directory (the directory must be empty), for instance:delete PUSU >");
                System.out.println();
                System.out
                        .println("rename FileName/CatalogName NewName");
                System.out.println("<rename a file or a directory, for instance: rename myfile mycomputer >");
                System.out.println();
                System.out
                        .println("search FileAbsolutedRoad/CatalogAbsolutedRoad");
                System.out.println("<Finding a file or directory based on an absolute path, for instance: search root/marco >");
                System.out.println();
                System.out.println("showFAT");
                System.out.println("<Look at the FAT table, for instance: showFAT>");
                System.out.println();
                System.out.println();
                System.out.println("The following command needs to open the file before:");
                System.out
                        .println("addContents FileName ContentSize");
                System.out.println("<Add content to a file, for instance:ddContents PUSU 4 >");
                System.out.println();
                System.out
                        .println("changeType FileName newType");
                System.out.println("<Change file type, for instance: changeType PUSU doc>");
                System.out.println();
                break;
            }
            default:
                for(String st : strs)
                    System.out.println(st);
                System.out.println("The command you have entered is incorrect. Please check it.");
            }
            System.out.println("Please enter command line(Enter help to view the command table)::");
        }
    }

    public static String[] editStr(String str) {
        Pattern pattern = Pattern.compile("([a-zA-Z0-9.\\\\/]*) *");// 根據空格分割輸入命令
        Matcher m = pattern.matcher(str);
        ArrayList<String>  list = new ArrayList<String>();
        while(m.find()){
            list.add(m.group(1));
        }
        String[] strs = list.toArray(new String[list.size()]);
        
        for (int i = 1; i < strs.length; i++) { // 判斷除命令以外每一個參數中是否含有 "."
            int j = strs[i].indexOf(".");
            if (j != -1) { // 若含有"." 將其切割 取前部分作為文件名
                String[] index = strs[i].split("\\."); // 使用轉義字符"\\."
                strs[i] = index[0];
            }
        } 
        return strs;
    }

}

Running Effect

屏幕快照 2017-12-08 11.35.56.png
屏幕快照 2017-12-08 11.35.56.png

屏幕快照 2017-12-08 11.36.09.png
屏幕快照 2017-12-08 11.36.09.png

屏幕快照 2017-12-08 11.36.30.png
屏幕快照 2017-12-08 11.36.30.png

屏幕快照 2017-12-08 11.36.40.png
屏幕快照 2017-12-08 11.36.40.png

Source Download

Please click the address->File System Structure

Summarize

用java語言模擬操作系統中的文件管理系統,文件模擬磁盤,數組模擬緩沖區(qū),其中:

  1. 支持多級目錄結構,支持文件的絕對讀路徑;
  2. 文件的邏輯結構采用流式結構,物理結構采用鏈接結構中的顯式鏈接方式;
  3. 采用文件分配表FAT;
  4. 實現的命令包括建立目錄、列目錄、刪除空目錄、建立文件、刪除文件、顯示
    文件內容、打開文件、讀文件、寫文件、關閉文件、改變文件屬性。可以采用
    命令行界面執(zhí)行這些命令,也可以采用“右擊快捷菜單選擇”方式執(zhí)行命令。
  5. 后編寫主函數對所作工作進行測試。

原文地址:www.iooy.com

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容