当前位置:编程学习 > C#/ASP.NET >>

c# 读取文件时总报另一个进行在用,急急。

StreamReader myReader = null;  
FileStream aFile = new FileStream(dataFilePath, FileMode.Open);
                myReader = new StreamReader(aFile, Encoding.GetEncoding("GB2312"));
                string strLine = "";
                int iTmp = 0;
                int j = 0;
                while (strLine != null)
                {

                    strLine = myReader.ReadLine();

                    while (iTmp > 0)
                    { 
                        
                    }

                    //列头不要
                    if (j == 0)
                    {
                        j++;
                        continue;
                    }
                    if (strLine != null && strLine.Length > 0)
                    {
                        al.Add(strLine.Split(','));
                    }
                    j++;
                }
                //
                myReader.Close();
                aFile.Close();
--------------------编程问答--------------------

            string path = Application.ExecutablePath.Substring(0, Application.ExecutablePath.LastIndexOf('\\') + 1);
            path += "test.txt";
            //方法一:写文本文件.txt
            StreamWriter writer = null;
            if (File.Exists(path))
            {
                writer = File.AppendText(path);
            }
            else
            {
                writer = File.CreateText(path);
            }
            writer.WriteLine(DateTime.Now.ToString());
            writer.Close();
--------------------编程问答--------------------
引用 1 楼 ronaltn 的回复:
C# code

            string path = Application.ExecutablePath.Substring(0, Application.ExecutablePath.LastIndexOf('\\') + 1);
            path += "test.txt";
            //方法一:写文本文件.txt
            ……


失误,这是写文件…… --------------------编程问答-------------------- 上面两个回答什么意思呵,我是读取CSV的文件,一读有时候就说另一个进程被占用,我已经关闭了啊,高人指典. --------------------编程问答-------------------- FileStream aFile = new FileStream(dataFilePath, FileMode.Open);
  myReader = new StreamReader(aFile, Encoding.GetEncoding("GB2312"));
两个数据流操作总有个顺序啊,一个没进行完你就开始读里面的文件流,很有可能出你这种错误的!
先执行完一个流在对读完的流操作! --------------------编程问答-------------------- 还有楼主你结贴率太低,别人不愿意回答你的! --------------------编程问答-------------------- 高人指典啊。 --------------------编程问答-------------------- using(FileStream aFile = new FileStream(dataFilePath, FileMode.Open))
{
...
aFile.close(); }
操作文件,再关闭close
--------------------编程问答-------------------- 上面老师,你看我写的代码怎么改好,非常感谢。 --------------------编程问答--------------------
  StreamReader myReader = null;   
  myReader = new StreamReader(dataFilePath, Encoding.GetEncoding("GB2312"));
  string strLine = "";
  // 下略。。
FileStream可不用吧,直接用文件名获取StreamReader。。 --------------------编程问答-------------------- 如果你使用了文件流操作, 那么你必须在使用完之后把这个流关闭,. 否则就会像楼主这样报错. --------------------编程问答-------------------- 我也关闭了啊,帮看一下。 --------------------编程问答--------------------
  StreamReader myReader = null;   
  myReader = new StreamReader(dataFilePath, Encoding.GetEncoding("GB2312"));
  string strLine = "";
  // 下略。。
试试这样可以不。。 --------------------编程问答-------------------- 恩
引用 7 楼 wuyq11 的回复:
using(FileStream aFile = new FileStream(dataFilePath, FileMode.Open))
{
...
aFile.close(); }
操作文件,再关闭close
--------------------编程问答-------------------- 资源竞争啦,要用锁,防止同时一个读,一个写,我在你的代码上写了个类,你用这个类试试吧

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;

namespace HttpClientTester
{
    public class ClassFileOperator
    {
        private static object syncobj = new object();
        public static void WriteToFile(string dataFilePath,ArrayList al,bool needLock)
        {
            if (needLock)
            {
                lock (syncobj)
                {
                    WriteToFileMethod(dataFilePath, al);
                }
            }
            else
            {
                WriteToFileMethod(dataFilePath, al);
            }
        }

        private static void WriteToFileMethod(string dataFilePath, ArrayList al)
        {
            StreamWriter writer = new StreamWriter(dataFilePath,false,Encoding.GetEncoding("GB2312"));
            
            foreach (object item in al)
            {
                writer.Write(item.ToString());
                writer.Write(",");
            }
            writer.Close();
        }

        public static ArrayList ReadFromFile(string dataFilePath, bool needLock)
        {
            if (needLock)
            {
                lock (syncobj)
                {
                   return  ReadFromFileMethod(dataFilePath);
                }
            }
            else
            {
                return ReadFromFileMethod(dataFilePath);
            }
        }

        private static ArrayList ReadFromFileMethod(string dataFilePath)
        {
            ArrayList al = new ArrayList();
            
            StreamReader myReader = null;
            FileStream aFile = new FileStream(dataFilePath, FileMode.Open);
            myReader = new StreamReader(aFile, Encoding.GetEncoding("GB2312"));
            string strLine = "";
            int iTmp = 0;
            int j = 0;
            while (strLine != null)
            {

                strLine = myReader.ReadLine();

                while (iTmp > 0)
                {

                }

                //列头不要
                if (j == 0)
                {
                    j++;
                    continue;
                }
                if (strLine != null && strLine.Length > 0)
                {
                    al.Add(strLine.Split(','));
                }
                j++;
            }
            //
            myReader.Close();
            aFile.Close();
            return al;
        }
    }
}

--------------------编程问答-------------------- --------------------编程问答-------------------- 重新启动计算机症状会消失 --------------------编程问答--------------------  using(FileStream aFile = new FileStream(dataFilePath, FileMode.Open,FileShare.ReadWrite))
{
} --------------------编程问答-------------------- 我上面的代码,可以解决并发的释放

但是我个人并不建议这么搞,多人并发我很难想象最终的文件会成啥样

所以个人建议14楼的lock方式去锁定文件,来避免并发 --------------------编程问答-------------------- 各位老师我的意思不是并发,就一个人操作,我那个也提示进程被使用
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,