C# 流文件、使用中的文件、FilesSystemWatcher 和有关线程的问题(菜鸟问题)

问题描述 投票:0回答:1

我一直在尝试创建一个脚本,该脚本获取文本文件的内容,可能如下所示(.txt 文件中的 1 行文本)

SomeData     SomeData     SomeData

这些文件会随机放入一个文件夹中。有时10个,有时1个。然后,大约每十分钟就会使用 robocopy 将文件从该文件夹移动到另一个文件夹。

无论如何,我想读取每个文件的单行文本并插入到数据库中。

工作正常一两次,但后来我得到文件正在使用错误。

尝试从 File.ReadAllText(textFile) 切换到 FileStream,但仍然存在相同的问题。

有人可以帮忙吗?

另外,我有点担心放到服务器上时可能使用的线程数量。我可以在 Visual Studio Code 中看到线程,但有兴趣知道我可以做些什么来改进我的脚本并使其更高效?

我是 .exe 文件编码新手!这将是我的第一次。

using System;
using System.IO;
using System.Data.SqlClient;


namespace IDGFileSystemWatcher
{
    class Program
    {
        static void Main(string[] args)

        {

            string path = "C:/Test/";
            MonitorDirectory(path);
            Console.ReadKey();

        }

        private static void MonitorDirectory(string path)

        {

            FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
            fileSystemWatcher.Path = path;
            fileSystemWatcher.Created += FileSystemWatcher_Created;
            fileSystemWatcher.EnableRaisingEvents = true;

        }

        private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)

        {
            
            string txtContents;
            string dir = "C:/Test/";
            string textFile = dir + e.Name;
            //string text = File.ReadAllText(textFile);
          


            FileStream fs = new FileStream(textFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            StreamReader sr = new StreamReader(fs);
            txtContents = sr.ReadToEnd();
            sr.Close();

            string[] splitstring = txtContents.Split(new char[0], StringSplitOptions.RemoveEmptyEntries);
            DateTime now = DateTime.Now;
            
                 
                        SqlConnection connection = new SqlConnection();
                        connection.ConnectionString =
                        "Data Source=computername;" +
                        "Initial Catalog=contents;" +
                        "User id=userid;" + 
                        "Password=password;";

                    
                        String query = "INSERT INTO dbo.MB1B (Field1, Field2, Field3, TStamp) VALUES (@Field1, @Field2, @Field3, @TStamp)";

                        using(SqlCommand command = new SqlCommand(query, connection))
                        {
                            command.Parameters.AddWithValue("@Field1", splitstring[0]);
                            command.Parameters.AddWithValue("@Field2", splitstring[1]);
                            command.Parameters.AddWithValue("@Field3", splitstring[2]);
                            command.Parameters.AddWithValue("@TStamp", now);

                            connection.Open();
                            int result = command.ExecuteNonQuery();

                            // Check Error
                            if(result < 0) {
                                Console.WriteLine("Error inserting data into Database!");
                            }

                            //connection.Close();

                            }


        }

    }
}

尝试使用 File.ReadAllText(textFile) 和 FileStream 我尝试检查这些文件是否正在使用,但我只是将 test /txt 文件从一个文件夹复制并粘贴到另一个文件夹,有时是 10 个文件夹,有时是单个文件夹。或者将 50 个测试文本文件放入一个文件夹中。 我尝试等待使用超时(因此文件未使用),并且我尝试向脚本添加暂停。 请注意,没有任何内容被写回文件,我只是读取文件并将文件中单行文本中的三个项目输入到数据库中。

c# filestream filesystemwatcher
1个回答
0
投票

FileStream
StreamReader
IDisposable
,这意味着它们通常应该与
using
关键字结合使用,以便它们消耗的资源在完成后得到正确的处置。


            using FileStream fs = new FileStream(textFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            using StreamReader sr = new StreamReader(fs);
            txtContents = sr.ReadToEnd();

这也意味着您实际上不必显式关闭它们,因为这是在将它们放置在块末尾时完成的。就目前情况而言,您只是关闭了

StreamReader
,而不是
FileStream
本身。

© www.soinside.com 2019 - 2024. All rights reserved.