Member 13639193 Ответов: 3

Возникли проблемы с загрузкой ZK SDK-не удается получить весь файл журнала


Dear Sir, 
iam writing a windows service to get attendance log from attendance machine ,  iam using Visual Studio 2015 
and iam working on windows 10 64 bit  , the refence file name  is ZKEUEmKeeperNet.dll  version 1.0.0.0
runtime version v2.0.50727  actually iam facing 2 problems : 
 
1- iam getting partial log : i mean not all punch transactions appear (iam taking this data to DB Oracle )!!!!
i tried  i do not know why  but iam  removed the DB connection code and trying to write the data directly to harddisk  using writetofile function
 
2- iam not getting the log file on harddisk this is not an sdk problem as i think  this problem happened recently i do not know why!!
 
 any suggestions for this problem or is the database connection with orable caused a problem or the Onstart service time caused a problem iam running the service every 10 seconds and if i increased the time  problems happen like if  i make it every 100 seconds , please i need support it is taking too much time , thanks in advance 
 
below is my code:  
i tried the code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Timers;
using System.IO;
using System.Threading.Tasks;
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess;
namespace Att_Service2
{
public partial class Service1 : ServiceBase
{
ZkSoftwareEU.CZKEUEMNetClass axCZKEM1 = new ZkSoftwareEU.CZKEUEMNetClass();
private bool bIsConnected = false;//the boolean value identifies whether the device is connected
private int iMachineNumber = 1;//the serial number of the device.After connecting the device ,this value will be changed.
Timer timer = new Timer(); // name space(using System.Timers;)
string sdwEnrollNumber = "";
int idwTMachineNumber = 0;
int idwEMachineNumber = 0;
int idwVerifyMode = 0;
int idwInOutMode = 0;
int idwYear = 0;
int idwMonth = 0;
int idwDay = 0;
int idwHour = 0;
int idwMinute = 0;
int idwSecond = 0;
int idwWorkcode = 0;
int idwErrorCode = 0;
int iGLCount = 0;
int iIndex = 0;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
// WriteToFile("Service is started at " + DateTime.Now);
timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
timer.Interval = 10000; //10 seconds 
timer.Enabled = true;
}
protected override void OnStop()
{
// WriteToFile("Service is stopped at " + DateTime.Now);
}
public void WriteToFile(string Message)
{
string path = "D:\\Logs";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
//AppDomain.CurrentDomain.BaseDirectory +
string filepath = "D:\\Logs\\ServiceLog_" + DateTime.Now.Date.ToShortDateString().Replace('/', '_') + ".txt";
if (!File.Exists(filepath))
{
// Create a file to write to.
using (StreamWriter sw = File.CreateText(filepath))
{
sw.WriteLine(Message);
}
}
else
{
using (StreamWriter sw = File.AppendText(filepath))
{
sw.WriteLine(Message);
}
}
}
private void OnElapsedTime(object source, ElapsedEventArgs e)
{
ZkSoftwareEU.CZKEUEMNetClass axCZKEM1 = new ZkSoftwareEU.CZKEUEMNetClass();
string TNS;
string IP;
//data in file should be like
//DATA SOURCE = 192.168.2.240:1521 / ORCL; USER ID = XXXXX; Password = YYYYY-192.168.2.74-
string totalData = File.ReadAllText(@"c:\Data\Att1.txt"); //read information for attendance Machine1
try
{
int index = totalData.IndexOf("-");
int lastindex = totalData.LastIndexOf("-");
int IPlength = lastindex - index - 1;
TNS = totalData.Substring(0, index).ToString().Trim();
IP = totalData.Substring(index + 1, IPlength).ToString().Trim();
}
catch (Exception ex) { WriteToFile("No file exist or revise the format to be like DATA SOURCE = 192.168.2.240:1521 / ORCL; USER ID = ASCON; Password = ASCON-192.168.2.74- the file path is c:\\data\\Att1.txt");return;}
/////////////////////////////////////////////////////////////////////////////////////
string sdwEnrollNumber = "";
int idwTMachineNumber = 0;
int idwEMachineNumber = 0;
int idwVerifyMode = 0;
int idwInOutMode = 0;
int idwYear = 0;
int idwMonth = 0;
int idwDay = 0;
int idwHour = 0;
int idwMinute = 0;
int idwSecond = 0;
int idwWorkcode = 0;
int idwErrorCode = 0;
int iGLCount = 0;
int iIndex = 0;
int Port = 4370;
bool bIsConnected;
int iMachineNumber = 1;
string insertSQL;
//3- Get Data From Attandance Machine
try 
{ 
while (axCZKEM1.Connect_Net(IP, Port) != true) ;//****New check connection TCP
WriteToFile("Connected to attendance "+DateTime.Now.ToString());
 
axCZKEM1.EnableDevice(iMachineNumber, false);//disable the device today
WriteToFile("Device Disabled " + DateTime.Now.ToString());
 
while (axCZKEM1.ReadGeneralLogData(iMachineNumber) != true) ;//**New i added a loop instead of if 
WriteToFile("Begin Loop " + DateTime.Now.ToString());
 
while (axCZKEM1.SSR_GetGeneralLogData(iMachineNumber, ref sdwEnrollNumber, ref idwVerifyMode,
ref idwInOutMode, ref idwYear, ref idwMonth, ref idwDay, ref idwHour, ref idwMinute, ref idwSecond, ref idwWorkcode))//get records from the memory
{
// //insert into Oracle DB
DateTime Date = Convert.ToDateTime(idwYear.ToString() + "-" + idwMonth.ToString() + "-" + idwDay.ToString() + " " + idwHour.ToString() + ":" + idwMinute.ToString() + ":" + idwSecond.ToString());
// WriteToFile(Date);
//MessageBox.Show(iMachineNumber + "-" + sdwEnrollNumber + "-" + Date);
/*Commented on 18-7-2020
WriteToFile(iMachineNumber+"-"+ sdwEnrollNumber+"-"+ idwInOutMode+"-"+ Date);
*/
// MessageBox.Show("inserted Successfully");
}//end while
}//end try
 catch (Exception ex)
 { 
  WriteToFile("error " + ex.ToString()+ " at "+DateTime.Now.ToString() );
 }//today
}//end function
}//end class
}//end namespace


Что я уже пробовал:

я попробовал приведенный выше код пожалуйста любые предложения

3 Ответов

Рейтинг:
2

Member 13639193

Уважаемый сэр , спасибо за ответ , я добавлю запись в файл между try /catch и test
еще раз спасибо за освещение

кроме того, я спрашиваю , Может ли антивирус повлиять на мою службу windows ??


Member 13639193

также может быть разрешение файла , заставляющее не записывать данные , и есть ли какой-то определенный ответ по этому поводу .

Member 13639193

на самом деле я пытался дать разрешение на файл, но проблема сохраняется

Рейтинг:
1

johannesnestler

Я подозреваю, что ваше "основанное на таймере" решение вызывает проблемы. Почему бы не использовать FileSystemWatcher, наблюдать за файлами, которые вам нужны для изменения, и реагировать так же, как сейчас, на прошедшее событие. Даже если это не корень вашей текущей проблемы, это сделает ваш код гораздо менее подверженным ошибкам.

Догадка: Я думаю, что кто-то пишет в файл, пока вы пытаетесь его прочитать, и он заблокирован. поэтому откройте файл с разрешением только для чтения...

Еще одно предложение: Сделайте WriteToFile более легким, создайте каталог и т. д. перед этим и не проверяйте каждую запись.


P.S. антивирус так себя не ведет, это не ваша проблема...


Рейтинг:
0

OriginalGriff

На первый взгляд - и без возможности запустить этот код в тех же условиях, что и вы, это все, что может быть - это проблема разрешений.

Если папка, в которую приложение пытается записать данные, не имеет разрешений на запись / создание для пользователя, на котором работает приложение, то этот код завершится неудачей.

То, что я бы начал делать, это добавлять некоторые try...catch блоки к WriteToFile чтобы отслеживать, что происходит, и выдавать вам окна сообщений или подобные им, чтобы отслеживать, какие ошибки происходят, и использовать отладчик, чтобы точно узнать, что делает код.

А без этого-сплошные догадки!


Member 13639193

может ли антивирус вызвать ту же проблему

Member 13639193

может ли что-нибудь остановить мой сервис и перезапустить его снова, чтобы между ними был временной разрыв