Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用windows服务进行Csvhelper写入_C#_.net - Fatal编程技术网

C# 使用windows服务进行Csvhelper写入

C# 使用windows服务进行Csvhelper写入,c#,.net,C#,.net,我正在使用csvhelper和windows服务,该服务不间断运行。我想创建一个新的csv日志文件,只放置一次头值,直到文件大小增长到1000 kb,然后创建另一个新文件,使文件大小增长过大。此时,csv文件在windows服务启动时创建一次,但每次写入时都会重复头文件值 我们是否在csv助手中有一些配置属性来标记文件大小? 请看一下代码,并建议是否可以在.NET4.0中高效地完成此操作。 Windows服务代码 public partial class Service1 : ServiceBa

我正在使用csvhelper和windows服务,该服务不间断运行。我想创建一个新的csv日志文件,只放置一次头值,直到文件大小增长到1000 kb,然后创建另一个新文件,使文件大小增长过大。此时,csv文件在windows服务启动时创建一次,但每次写入时都会重复头文件值

我们是否在csv助手中有一些配置属性来标记文件大小? 请看一下代码,并建议是否可以在.NET4.0中高效地完成此操作。 Windows服务代码

public partial class Service1 : ServiceBase
{

    private Thread executeThread;

    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {            

        try
        {

            Thread.Sleep(30000);

            executeThread = new Thread(new ThreadStart(Execute));
            executeThread.Start();                                             

        }
        catch (Exception e)
        {
            Library.LogData("Error : " + DateTime.UtcNow + " " + e.Message);
            OnStop();
        }            
    }

    protected override void OnStop()
    {
        try
        {
            Library.LogData("Stopped: " + DateTime.UtcNow);
            executeThread.Abort();
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }            
    }

    public void Execute()
    {
        try
        {
            Library.LogData("Started");
            while (true)
            {
                Library.LogData("Logging Execute" + DateTime.UtcNow);
                Thread.Sleep(5000);
            }                 
        }
        catch (Exception e)
        {
            Library.LogData("Error : " + DateTime.UtcNow + " " + e.Message);
            OnStop();
        }
        Library.LogData("Out of Execute" + DateTime.UtcNow);
    }

}
windows服务调用的日志记录代码

public static class Library
{
    public static void LogData(string Message)
    {
        StreamWriter sw = null;
        GetData getData = new GetData();
        var dataClasslist = new List<DataClass>
        {
            new DataClass {}
        };
        try
        {

            dataClasslist = getData.ReadData();
            using (sw = new StreamWriter("E:\\DataLogs\\LogFile.csv", true))
            using (var csv = new CsvWriter(sw))
            {
                csv.Configuration.RegisterClassMap<DataClassMap>();
                csv.WriteHeader<DataClass>();
                csv.Configuration.TrimHeaders = true;
                csv.Configuration.HasHeaderRecord = false;
                csv.WriteRecords(dataClasslist);
                sw.Flush();
                sw.Close();
            }
        }
        catch (Exception e)
        {
            var err = new StreamWriter("E:\\DataLogs\\Errors", true);
            err.WriteLine(DateTime.Now.ToString() + ": " + e.Message.ToString());
            err.Flush();
            err.Close();
        }

    }

}
public partial class Service1 : ServiceBase
{

    private Thread executeThread;

    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        try
        {

            Thread.Sleep(10000);

            executeThread = new Thread(new ThreadStart(Execute));
            executeThread.Start();
        }
        catch (Exception e)
        {
            var err = new StreamWriter("E:\\DataLogs\\Errors", true);
            err.WriteLine(DateTime.Now.ToString() + " OnStart: " + e.Message.ToString());
            err.Flush();
            err.Close();
            OnStop();
        }
    }

    protected override void OnStop()
    {
        try
        {                
            executeThread.Abort();
        }
        catch (Exception e)
        {
            var err = new StreamWriter("E:\\DataLogs\\Errors", true);
            err.WriteLine(DateTime.Now.ToString() + "OnStop exception: " + e.Message.ToString());
            err.Flush();
            err.Close();
        }
    }

    public void Execute()
    {
        try
        {
            StreamWriter sw = null;
            string FileNameAndPath = null;
            FileNameAndPath = "E:\\DataLogs\\LogFile" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".csv";

            using (sw = new StreamWriter(FileNameAndPath, true))
            {
                sw.WriteLine("TimeStamp " + "," + "col1" + "," + "col2" + "," + "col3"
                    + "," + "col4" + "," + "col5" + "," + "col6" + ","
                    + "col8" + "," + "col9" + "," + "col7" + "," + "col10");
                sw.Flush();
                sw.Close();
            }
            while (true)
            {
                Library.LogData(FileNameAndPath);
                Thread.Sleep(5000);
            }
        }
        catch (Exception e)
        {
            var err = new StreamWriter("E:\\DataLogs\\Errors", true);
            err.WriteLine(DateTime.Now.ToString() + " Execute: " + e.Message.ToString());
            err.Flush();
            err.Close();
            OnStop();
        }
    }

    public void TestInConsole(string[] args)
    {
        Console.WriteLine("Starting.....");
        this.OnStart(args);
    } 
公共静态类库
{
公共静态无效日志数据(字符串消息)
{
StreamWriter sw=null;
GetData GetData=新建GetData();
var dataClasslist=新列表
{
新数据类{}
};
尝试
{
dataClasslist=getData.ReadData();
使用(sw=newstreamwriter(“E:\\DataLogs\\LogFile.csv”,true))
使用(var csv=新csv编写器(sw))
{
csv.Configuration.RegisterClassMap();
csv.WriteHeader();
csv.Configuration.TrimHeaders=true;
csv.Configuration.HasHeaderRecord=false;
csv.WriterRecords(数据类列表);
sw.Flush();
sw.Close();
}
}
捕获(例外e)
{
var err=new StreamWriter(“E:\\DataLogs\\Errors”,true);
err.WriteLine(DateTime.Now.ToString()+”:“+e.Message.ToString());
err.Flush();
err.Close();
}
}
}
主windows服务

public static class Library
{
    public static void LogData(string Message)
    {
        StreamWriter sw = null;
        GetData getData = new GetData();
        var dataClasslist = new List<DataClass>
        {
            new DataClass {}
        };
        try
        {

            dataClasslist = getData.ReadData();
            using (sw = new StreamWriter("E:\\DataLogs\\LogFile.csv", true))
            using (var csv = new CsvWriter(sw))
            {
                csv.Configuration.RegisterClassMap<DataClassMap>();
                csv.WriteHeader<DataClass>();
                csv.Configuration.TrimHeaders = true;
                csv.Configuration.HasHeaderRecord = false;
                csv.WriteRecords(dataClasslist);
                sw.Flush();
                sw.Close();
            }
        }
        catch (Exception e)
        {
            var err = new StreamWriter("E:\\DataLogs\\Errors", true);
            err.WriteLine(DateTime.Now.ToString() + ": " + e.Message.ToString());
            err.Flush();
            err.Close();
        }

    }

}
public partial class Service1 : ServiceBase
{

    private Thread executeThread;

    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        try
        {

            Thread.Sleep(10000);

            executeThread = new Thread(new ThreadStart(Execute));
            executeThread.Start();
        }
        catch (Exception e)
        {
            var err = new StreamWriter("E:\\DataLogs\\Errors", true);
            err.WriteLine(DateTime.Now.ToString() + " OnStart: " + e.Message.ToString());
            err.Flush();
            err.Close();
            OnStop();
        }
    }

    protected override void OnStop()
    {
        try
        {                
            executeThread.Abort();
        }
        catch (Exception e)
        {
            var err = new StreamWriter("E:\\DataLogs\\Errors", true);
            err.WriteLine(DateTime.Now.ToString() + "OnStop exception: " + e.Message.ToString());
            err.Flush();
            err.Close();
        }
    }

    public void Execute()
    {
        try
        {
            StreamWriter sw = null;
            string FileNameAndPath = null;
            FileNameAndPath = "E:\\DataLogs\\LogFile" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".csv";

            using (sw = new StreamWriter(FileNameAndPath, true))
            {
                sw.WriteLine("TimeStamp " + "," + "col1" + "," + "col2" + "," + "col3"
                    + "," + "col4" + "," + "col5" + "," + "col6" + ","
                    + "col8" + "," + "col9" + "," + "col7" + "," + "col10");
                sw.Flush();
                sw.Close();
            }
            while (true)
            {
                Library.LogData(FileNameAndPath);
                Thread.Sleep(5000);
            }
        }
        catch (Exception e)
        {
            var err = new StreamWriter("E:\\DataLogs\\Errors", true);
            err.WriteLine(DateTime.Now.ToString() + " Execute: " + e.Message.ToString());
            err.Flush();
            err.Close();
            OnStop();
        }
    }

    public void TestInConsole(string[] args)
    {
        Console.WriteLine("Starting.....");
        this.OnStart(args);
    } 
所以,一旦文件达到100kb,就会调用OnExecute,并且新文件中只会写入一次头文件

public static class Library
{
    public static void LogData(string FileNameAndPath)
    {
        StreamWriter sw = null;
        GetData getData = new GetData();
        var dataClasslist = new List<DataClass>
        {
            new DataClass {}
        };
        try
        {
            //System.Diagnostics.Debugger.Break();
            dataClasslist = getData.ReadData();
            //Create a file seperately                                
            using (sw = new StreamWriter(FileNameAndPath, true))
            using (var csv = new CsvWriter(sw))
            {
                csv.Configuration.RegisterClassMap<DataClassMap>();
                //csv.WriteHeader<DataClass>();
                csv.Configuration.TrimHeaders = true;
                csv.Configuration.HasHeaderRecord = false;
                csv.WriteRecords(dataClasslist);
                sw.Flush();
                sw.Close();
            }

            var FileSize = new FileInfo(FileNameAndPath);

            //for each 1000 kb
            if (FileSize.Length >= 1e+6)
            {
                //go back to the start to create a new file and column headers
                Service1 serive1 = new Service1();
                serive1.Execute();
            }
        }
        catch (Exception e)
        {
            var err = new StreamWriter("E:\\DataLogs\\Errors", true);
            err.WriteLine(DateTime.Now.ToString() + " LogData: " + e.Message.ToString());
            err.Flush();
            err.Close();
        }

    }

}
公共静态类库
{
公共静态void日志数据(字符串FileNameAndPath)
{
StreamWriter sw=null;
GetData GetData=新建GetData();
var dataClasslist=新列表
{
新数据类{}
};
尝试
{
//System.Diagnostics.Debugger.Break();
dataClasslist=getData.ReadData();
//单独创建一个文件
使用(sw=newstreamwriter(FileNameAndPath,true))
使用(var csv=新csv编写器(sw))
{
csv.Configuration.RegisterClassMap();
//csv.WriteHeader();
csv.Configuration.TrimHeaders=true;
csv.Configuration.HasHeaderRecord=false;
csv.WriterRecords(数据类列表);
sw.Flush();
sw.Close();
}
var FileSize=newfileinfo(FileNameAndPath);
//每1000 kb
如果(FileSize.Length>=1e+6)
{
//返回开始创建新的文件和列标题
Service1 serive1=新Service1();
serive1.Execute();
}
}
捕获(例外e)
{
var err=new StreamWriter(“E:\\DataLogs\\Errors”,true);
err.WriteLine(DateTime.Now.ToString()+“LogData:”+e.Message.ToString());
err.Flush();
err.Close();
}
}
}

我欢迎您的建议,请告诉我您是否可以找到更好的方法来解决此问题。

您能否检查成为Windows服务的一部分是否对问题的发生很重要?听起来很奇怪,如果你需要滚动日志,你在简单的情况下看不到它(比如基本控制台应用),我认为最好切换到一些也支持登录到CSV的日志库(比如NLog)我想创建一个新的csv日志文件,只放置一次头值,直到文件大小增长到1000 kb,然后创建另一个新文件,即使我使用console app或wpf,它会有什么不同。问题是,我要创建一个日志文件,在创建文件时,头只放入一次。Col1header、Col1header、Col1header、Col1headerColheader1、Colheader2、Colheader3----------------------value1、value2、value3 value1、value2、value3文件大小达到1000kb时创建一个新文件。Colheader1,Colheader2,Colheader3--------------------值1,值2,值3值1,值2,值3