xml地图|网站地图|网站标签 [设为首页] [加入收藏]
文件的操作,在线运行
分类:编程

一、文件读写模式

1、文件的几种模式:

格式:f=open("文件名","模式",encode="utf-8")

1 #文件的只读模式
2 f1=open("test1","r",encoding="utf-8") #encoding="utf-8"可以不写
3 print(f1.read())
4 #文件只写模式,文件如果不存在,则创建,存在写入内容会覆盖原来的
5 f2=open("test2","w",encoding="utf-8")
6 f2.write("q5ertn")
7 #文件追加模式,通常用于写日志
8 f3=open("test2","a",encoding="utf-8")
9 f3.write("1213n1234")

"+" 表示可以同时读写文件

  • r+, 读写【可读,可写】
  • w+,写读【可读,可写】
  • x+ ,写读【可读,可写】
  • a+, 写读【可读,可写】

 "b"表示以字节的方式操作

  • 澳门新葡亰手机版,rb  或 r+b
  • wb 或 w+b
  • xb 或 w+b
  • ab 或 a+b

 注:以b方式打开时,读取的是byte类型

 1 # #读写模式、先读后写
 2 # f1=open("test1","r+")
 3 # print(f1.read())
 4 # f1.write("qqqqqqqqqq")
 5 # #写读模式,先写后读
 6 # f2=open("test2","w+")
 7 # f2.write("qqqqqqqqqq")
 8 # f2.read()
 9 # print(f2.read())
10 #追加写读
11 f2=open("test2","a+")
12 f2.write("wwwwwwww")
13 
14 # f1=open("test1","rb")  #不需要指定编码
15 # print(f1.read())
16 # #b'0000000000rn1111111111rn2222222222rn3333333333rn4444444444rn5555555555'

3、文件的修改,例如将test2中的文件内容修改成test1的内容

1 import os
2 with open('test1','r',encoding="utf-8") as f1,  
3         open('test2','w',encoding="utf-8") as f2:
4     for i in f1:
5         f2.write(line)
6 
7 os.remove('test1')
8 os.rename('test2','test3')

如果我们对文件其中某个内容就行修改呢

打开两个文件,修改其中内容后再写入另一个文件
f1=open("text1","r+",encoding="utf-8")
f2=open("text2","w+",encoding="utf-8")
for line in f:
    if "1111" in line:
        line=line.replace("1111","qqqq")
    f2.write(line)

 

初步完成c#代码的在线编辑。    

 CancellationToken的多种应用

澳门新葡亰手机版 1

这是线程安全的最后一篇了,主要介绍CancellationToken的多种应用。

 

1,ThreadPool直接启动线程,传递CancellationToken。

首先,传回前端的c#在线代码,进行预编译,用CSharpCodeProvider这个方法。设置编译版本3.5

2,Task启动线程,传递CancellationToken。Task传递方式分为两种,一种通过Task的参数进行传递,另一种通过向线程内传递对象的方式传递CancellationToken。

设置编译参数GenerateInMemory:是否在内存运行,True - memory generation, false - external file generation。

3,CancellationToken的回调函数应用。

设置生成执行文件的类型GenerateExecutable:True - exe file generation, false - dll file generation。

话不多说,请看代码。

编译后返回result结果。

  class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("当前线程{0},当前状态{1}", Thread.CurrentThread.GetHashCode(), Thread.CurrentThread.ThreadState);
            //使用线程池创建线程,然后取消线程
            CancelWithThreadPoolMiniSnippet();
        }
        static CancellationTokenSource cts = new CancellationTokenSource();
        static CancellationToken token = cts.Token;
        static void CancelWithThreadPoolMiniSnippet()
        {
            Console.WriteLine("当前线程{0},当前状态{1}", Thread.CurrentThread.GetHashCode(), Thread.CurrentThread.ThreadState);

            #region 使用QueueUserWorkItem的构造函数,传递cts.Token,但我不喜欢这个模式 跟踪不了状态
            //ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomeWork), ctn);
            #endregion

            #region 使用传递参数的模式 传递CancellationToken,这里的cts.Token是作为Action的参数传递的
            //var action = new Action<object>(DoSomeWork);
            //Task t = new Task(action, ctn);
            //t.Start();
            //Console.WriteLine("开始,当前线程{0},当前状态{1}", t.GetHashCode(), t.Status);
            #endregion

            #region 使用Task的构造函数,传递cts.Token,但CancellationTokenSource要弄成全局变量,否则方法找不到,就取消不了。
            //Task t = new Task(Work, cts.Token);
            //t.Start();
            #endregion

            #region 注册回调函数,当CancellationTokenSource.Cancel()执行后,调用回调函数 
            token.Register(CallBack, true);  //注册回调函数
            Task t = new Task(Work);
            t.Start();
            #endregion

            Thread.SpinWait(5000000);

            cts.Cancel();
            Console.WriteLine("结束,当前线程{0},当前状态{1}", t.GetHashCode(), t.Status);
            Console.Read();
        }


        static void DoSomeWork(object obj)
        {
            CancellationToken token = (CancellationToken)obj;
            for (int i = 0; i < 100000; i++)
            {
                Console.WriteLine(i);
                // Simulating work.
                //Thread.SpinWait(5000000);

                if (token.IsCancellationRequested)
                {

                    break;
                }
            }
        }


        static void Work()
        {

            for (int i = 0; i < 100000; i++)
            {
                Console.WriteLine(i);
                if (token.IsCancellationRequested)
                {

                    break;
                }
            }
        }

        static void CallBack()
        {

            Console.WriteLine("I'm call back!"   );
        }
    }

 

代码内执行结果如下,该结果为CancellationToken的回调函数应用:

澳门新葡亰手机版 2

澳门新葡亰手机版 3

异常处理:如果编译时发生错误,生成错误编号和错误文本信息并返回给前端。

到此NET Framework4.0里的线程安全就都讲完了。。。。。。。

 

虽然第一篇文章是2013年,虽然历时近五年,但请相信我,代码早在五年前就已经写完啦。只是我一直一直一直没配文字发出来。。。。。。

本文由澳门新葡亰手机版发布于编程,转载请注明出处:文件的操作,在线运行

上一篇:删除同目录下面txt文件,Python标准库笔记 下一篇:递归算法
猜你喜欢
热门排行
精彩图文