F#小程序——上传指定类型文件到云服务器或下载到本地

当时根据涛哥的要求,做了一个小工具,具体作用就是上传或下载指定类型文件到云服务器。当时涛哥正在做VS的一个插件: F# snippet ,类似于C#中的.net AutoCode v4.0,区别就在于它们工作的语言不同。

这个工具使用到了F#3.0的新功能:Type Provider and Query.如果你想尝试一下这个工具(当然,你需要做些修改:)),那么你需要F# 3.0 或者 VS2012。如果只想了解一下这个工具,也不错~ 呵呵

下面是代码:)

// Learn more about F# at http://fsharp.net
// See the 'F# Tutorial' project for more help.
open Microsoft.FSharp.Data.TypeProviders
open System
open System.Collections
//input your connection string of you DB on cloud
type internal T = Microsoft.FSharp.Data.TypeProviders.SqlEntityConnection<"????">
let internal data = T.GetDataContext().SnippetTable

let UpLoadToDB(fileName : string, fileContent) = 
    let newData = new T.ServiceTypes.SnippetTable()  
    let guid = System.Guid.NewGuid()
    let time = System.DateTime.Now
    newData.FileName <- fileName
    newData.SnippetContent <- fileContent
    newData.CreatedDateTime <- Nullable.op_Implicit(time)
    newData.Language <- 0
    newData.IsEnable <- true
    newData.ID <- guid
    newData.Language <- 0
    let dataContent = T.GetDataContext()
    
    dataContent.SnippetTable.AddObject(newData)
    dataContent.DataContext.SaveChanges() |> ignore

let UpLoadFileByDic(dic : string) =
    if (System.IO.File.Exists(dic) = true || System.IO.Directory.Exists(dic) = false) then
        printfn "Please upload a folder"
    else
        let filesHolder = System.IO.Directory.GetFiles(dic)
        let fileSeq = filesHolder |> Array.toSeq
        let snippetFileSeq = fileSeq |> Seq.filter (fun file -> System.IO.Path.GetExtension(file) = ".snippet") 

        snippetFileSeq
            |> Seq.iter( fun filepath ->
                            let filePath = System.IO.Path.Combine(dic, filepath)                            
                            let name = System.IO.Path.GetFileNameWithoutExtension(filepath)
                            use streamReader = new System.IO.StreamReader(filePath)
                            let content = streamReader.ReadToEnd()
                            UpLoadToDB(name,content)
                            
                            )

let CreatFileForBackUp(fileName : string, fileContext : string) =
    let currentFolder = System.Environment.CurrentDirectory
    let newFolder = System.IO.Path.Combine(currentFolder, "backup")
    System.IO.Directory.CreateDirectory(newFolder) |> ignore
    let fileNameAndExtension = fileName + ".snippet"
    let fullFilePath = System.IO.Path.Combine(newFolder,fileNameAndExtension)
    if(System.IO.File.Exists(fullFilePath) <> true) then
        use streamWriter = System.IO.File.CreateText(fullFilePath)
        streamWriter.WriteLine(fileContext)
        streamWriter.Close()
    
let BackUp() = 
    let item = 
        query{
            for i in data do
            where(i.FileName <> "")
            select i
        }
    
    item 
        |> Seq.iter( fun i -> CreatFileForBackUp( i.FileName,i.SnippetContent))
    printfn "Done, anything else you want to do?"


let WaitUserInputDic() =
    printfn "Please input the folder path"
    let path = Console.ReadLine().Trim()
    UpLoadFileByDic(path)
    printfn "Done, anything else you want to do?"
let Execute() =
    Console.ForegroundColor <- ConsoleColor.Red
    Console.BackgroundColor <- ConsoleColor.DarkGreen
    Console.Clear()   
    printfn "Please select the command you want to execute(input the number of the command):"
    printfn ""
    printfn " 1 : Back Up(DownLoad all snippets in DataBase to the folder backup which is in current folder)"
    printfn ""
    printfn " 2 : Up load a folder to DataBase(upload all snippet files in the folder,not include those in subfolder)"
    printfn ""
    printfn " 3 : Exist"
    let rec selectCommand() = 
        let command = Console.ReadLine()
        let tripCommand = command.Trim()
        match tripCommand with
        | "1" ->  BackUp();selectCommand()
        | "2" ->  WaitUserInputDic();selectCommand()
        | "3" -> ()
        | _ -> printfn "Please the command number"; selectCommand()
    selectCommand()

[<EntryPoint>]
let main argv = 
    Execute()
    0

代码中的函数 UpLoadFileByDic() 负责上传至DB, BackUp()负责下载DB上以存的Snippet到当前目录。UpLoadToDB 函数则是对DB中的表进行操作,生成并插入一个新表。

注意:在这行代码 type internal T = Microsoft.FSharp.Data.TypeProviders.SqlEntityConnection  后面加的参数是连接DB的那个Connection string,有个技巧就是:你可以从C#中连接到这个数据库,然后从属性里面可以找到这个Connection string。

Ok,代码就这么多。。。留个笔记也好~:)