chan 需要两个进程,一个写,一个读,是分开的,

  1. package main
  2.  
  3. import (
    "bufio"
    "fmt"
    "math/rand"
    "os"
    "strings"
    "sync"
    "time"
    )
  4.  
  5. type (
    cdnfileinfo struct {
    filename string
    buf []byte
    sync.RWMutex
    wrtype int
    serr string
    }
    fileWrok interface {
    isDirExtxit(path string) int
    Writefile(b *backset)
    Readfile(b *backset)
    Randfilename(b *backset)
    }
    fileWorkint interface {
    Randfilename(b *backset)
    }
  6.  
  7. Workout struct {
    fileWrok
    }
    workInt struct {
    fileWorkint
    }
    backset struct {
    ducks chan cdnfileinfo
    }
  8.  
  9. )
  10.  
  11. func (fi *Workout) isDirExtxit(path string) int {
    finfo, er := os.Stat(path)
    if er != nil {
    return 0
    }
    if finfo.IsDir() {
    return 1
    } else {
    return 2
    }
  12.  
  13. }
    func (fi *workInt)Randfilename(b *backset) {
    for {
    duck := cdnfileinfo{
    filename: "D:/Text/log" + fmt.Sprint(rand.Intn(999999)) + ".txt",
    wrtype: 2,
    buf: []byte("添加测试"),
    }
    fmt.Printf("type:%d filename:%s \n", duck.wrtype, duck.filename)
    b.ducks <- duck
    time.Sleep(time.Second)
    }
    }
  14.  
  15. func (fi *Workout) Writefile(b *backset) {
    for {
    duck, _ := <-b.ducks
    pos := strings.LastIndex(duck.filename, "/")
    path := duck.filename[0 : pos+1]
    switch fi.isDirExtxit(path) {
    case 0:
    {
    er := os.Mkdir(path, os.ModePerm)
    if er != nil {
    continue
    }
    }
    case 2:
    {
    continue
    }
  16.  
  17. }
  18.  
  19. f, er := os.OpenFile(duck.filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
    if er != nil {
  20.  
  21. }
    fbuf := bufio.NewWriter(f)
    fbuf.Write(duck.buf)
    fbuf.Flush()
    fmt.Printf("type:%d filename:%s \n", duck.wrtype, duck.filename)
    }
    }
    func (fi *Workout) Readfile(b *backset) error {
    duck,_:= <- b.ducks
    _, er := os.Stat(duck.filename)
    if er != nil {
    return nil
    }
    sf, er := os.Open(duck.filename)
    if er != nil {
    return er
    }
    rbuf := bufio.NewReader(sf)
    n, er := rbuf.Read(duck.buf)
    if er != nil {
    return nil
    }
    if n == 0 {
    return fmt.Errorf("读取文件为空")
    }
    return nil
    }
  22.  
  23. func main() {
    wa := new(sync.WaitGroup)
  24.  
  25. p := new(workInt)
    c := new(Workout)
    b := &backset{
    ducks: make(chan cdnfileinfo),
    }
  26.  
  27. wa.Add(2)
    go func() {
    p.Randfilename(b)
    wa.Done()
    }()
    go func() {
    c.Writefile(b)
    wa.Done()
    }()
  28.  
  29. wa.Wait()
  30.  
  31. }

Go chan 结构体 写入文件的更多相关文章

  1. Demo02_对结构体进行文件读写_张仕传_作业_

    #include <iostream> using namespace std; #define StructArrarySize 5 // 老师数量 #define StudentNum ...

  2. c++ 读写结构体到文件

    可以使用fwrite()将一个结构体写入文件:  fwrite(&some_struct,sizeof somestruct,1,fp);对应的fread函数可以再把它读出来,此处fwrite ...

  3. 68.qq号索引结构体写入内存,并实现快速排序

    //两个步骤,第一步读取文件,并且初始化索引结构体,把初始化的索引结构体写入到文件,第二步,读取这个文件到索引结构体 //并对这个结构体进行快速排序,得到顺序的索引,再写入文件 #define _CR ...

  4. Delphi基础Write写入结构体到文件(使用 file of myrecord就行了,真简单)

    program WriteStruct; {$APPTYPE CONSOLE} uses SysUtils; //写入结构体 type TCustomer = record ID: ]; Code: ...

  5. cdev成员结构体file_operations文件操作结构的分析

    struct file_operations{ struct module *owner; // 指向拥有该结构的模块的指针,避免正在操作时被卸载,一般为初始化为THIS_MODULES loff_t ...

  6. 几年前做家教写的C教程(之五专讲结构体与文件操作)

    C语言学习宝典(5) 结构体: 将不同类型的数据组合成为一个有机的整体,这个整体就是一个结构体. 例如: Struct student { Int name; Char sex; Float scor ...

  7. Linux C Socket编程发送结构体、文件详解及实例

    利用Socket发送文件.结构体.数字等,是在Socket编程中经常需要用到的.由于Socket只能发送字符串,所以可以使用发送字符串的方式发送文件.结构体.数字等等. 本文:http://www.c ...

  8. C语言中FILE是结构体,文件类型的指针

    c语言文件类型指针 我们在定义文件类型指针变量后,称作该指针指向该文件,但本质上,它不是指向一个存储文件信息的结构型变量么?那么我们在用各个函数对所谓的“文件指针”进行操作时,本质上是不是函数通过获取 ...

  9. C语言提高 (5) 第五天 结构体,结构体对齐 文件

    1昨日回顾 2作业讲解 3 结构体的基本定义 //1 struct teacher { int id; char name[64]; }; struct teacher t5 = { 5, " ...

随机推荐

  1. Vue项目预渲染机制

    我们知道SPA有很多优点,不过一个缺点就是对(不是Google的)愚蠢的搜索引擎的SEO不友好,为了照顾这些引擎,目前主要有两个方案:服务端渲染(Server Side Rendering).预渲染( ...

  2. linux jar/war包 后台运行

    1. 基础版,当前ssh窗口锁定,按CTRL+C打断程序运行:或关闭窗口,程序退出 java -jar flowable-modeler.war 2. 改进版,当前ssh窗口不锁定,窗口关闭时,程序终 ...

  3. pdf 中画虚线

    <?php require('fpdf.php'); class PDF_Dash extends FPDF { function SetDash($black=null, $white=nul ...

  4. windows如何删除服务

    有时候软件被安装成了服务,但是卸载后如何删除无效的服务,这时候就不是普通用户就能删除了,这属于操作系统管理级别了,需要使用管理命令了. 管理员权限打开cmd,执行如下: C:\Windows\syst ...

  5. sqlserver cdc用法

    SELECT top(10)  * from (SELECT  sys.fn_cdc_map_lsn_to_time([__$start_lsn])  'addtime',* FROM cdc.dbo ...

  6. 洛谷 P1969 积木大赛(NOIP2013)

    题目描述春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成n ...

  7. 基于springboot+jquery+H5的文件(并发+断点+分片)的上传方案

    1.支持文件分片断点续传 2.支持已上传文件再次上传时秒传 3.多个人对同一个文件同时上传可以多线程并发协调上传,加快超大文件的上传速度. 技术点:springboot + webflux + red ...

  8. linux剪贴板

    ubuntu下的用户可以只用apt-get来安装: `sudo apt-get install xclip ` 其他发行版的用户可以选择自己的安装方式,也可以用源码编译安装,xclip项目的主页是:h ...

  9. label vc

    #pragma once #include <QWidget> #include <QPaintEvent> #include <QPainter> #includ ...

  10. ubuntu 各压缩文件解压命令大全

    .tar 解包:tar xvf xxx.tar 打包:tar cvf xxx.tar DirName (注:tar是打包,不是压缩!) .gz 解压1:gunzip FileName.gz 解压2:g ...