简体   繁体   中英

XML is saving in multiple files

I developed a listener that receives data every 60 seconds, It is receiving data as XML Data Stream, which is complete XML. In most cases it is working fine, saving complete XML into a single file of 4 kb. However, Sometimes it is saving one complete XML into 2 files. I am not getting why this is happening. My code is below. Kindly help.

public static void GetXMLStream()
{
    TcpListener server = null;
    try
    {
        Int32 port = Int32.Parse(GetAppConfigValues.GetAppConfigValue("Port"));
        IPAddress localAddr = IPAddress.Parse(GetAppConfigValues.GetAppConfigValue("IPAddress"));
        server = new TcpListener(localAddr, port);
        server.Start();
        // Buffer for reading data
        Byte[] bytes = new Byte[256];
        String data = null;
        while (true)
        {
            TcpClient client = server.AcceptTcpClient();
            NetworkStream stream = client.GetStream();
            int i;
            while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
            {
                data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                WriteToFile(data);
            }
        }
    }
    catch (SocketException e)
    {}
    finally
    {
        // Stop listening for new clients.
        server.Stop();
    }
}
public static void WriteToFile(string sMessage)
{
    try
    {
        string fileName = "NiproMI" + DateTime.Now.ToString().Replace(" ", "_").Replace("/", "_").Replace(":", "_") + ".xml";
        DirectoryInfo logdirFile = new DirectoryInfo(System.Configuration.ConfigurationManager.AppSettings["XmlFilePath"].ToString());
        string filePath = logdirFile.FullName;
        if (File.Exists(Path.Combine(filePath, fileName)))
        {
            StreamWriter sw = null;
            FileStream fs = File.Open(Path.Combine(filePath, fileName), FileMode.Append, FileAccess.Write);
            sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
            sw.WriteLine(sMessage);
            sw.Close();
            sw = null;
        }
        else
        {
            StreamWriter sw = null;
            FileStream fs = new FileStream(Path.Combine(filePath, fileName), FileMode.Create, FileAccess.Write);
            sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
            sw.WriteLine(sMessage);
            sw.Close();
            sw = null;
        }
    }
    catch (Exception e)
    {
        NiproEventsLog.WriteLog(e.ToString());
    }
}

You should lift the file name out from WriteToFile, because one call of GetXMLStream should have only 1 file name.

Something like this:

public static void GetXMLStream()
    {
        string fileName = "NiproMI" + DateTime.Now.ToString().Replace(" ", "_").Replace("/", "_").Replace(":", "_") + ".xml";
        TcpListener server = null;
        try
        {
            Int32 port = Int32.Parse(GetAppConfigValues.GetAppConfigValue("Port"));
            IPAddress localAddr = IPAddress.Parse(GetAppConfigValues.GetAppConfigValue("IPAddress"));
            server = new TcpListener(localAddr, port);
            server.Start();
            // Buffer for reading data
            Byte[] bytes = new Byte[256];
            String data = null;
            while (true)
            {
                TcpClient client = server.AcceptTcpClient();
                NetworkStream stream = client.GetStream();
                int i;
                while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                    WriteToFile(data, fileName);
                }
            }
        }
        catch (SocketException e)
        {
            
        }
        finally
        {
            // Stop listening for new clients.
            server.Stop();
        }
    }
public static void WriteToFile(string sMessage, string fileName)
    {
        try {
            DirectoryInfo logdirFile = new DirectoryInfo(System.Configuration.ConfigurationManager.AppSettings["XmlFilePath"].ToString());
            string filePath = logdirFile.FullName;
            if (File.Exists(Path.Combine(filePath, fileName)))
            {
                StreamWriter sw = null;
                FileStream fs = File.Open(Path.Combine(filePath, fileName), FileMode.Append, FileAccess.Write);       
                sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
                sw.WriteLine(sMessage);
                sw.Close();
                sw = null;
            }
            else
            {
                StreamWriter sw = null;
                FileStream fs = new FileStream(Path.Combine(filePath, fileName), FileMode.Create, FileAccess.Write);       
                sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
                sw.WriteLine(sMessage);
                sw.Close();
                sw = null;
            }
        }
        catch (Exception e)
        {
            NiproEventsLog.WriteLog( e.ToString());
        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM