Tja, also in Dateiform gibt es dann so etwas nicht in die alles reingewurschtet werden kann ... dann muss ich etwas mit den Daten mit einer Verzeichnisstruktur erstellen
Hallo zusammen.
Ich habe die Aufgabe ein Tool zu erstellen, mit dem über einen gewünschten Dateinamen eine Datei zu öffnen und den Inhalt anzuzeigen. Der Wunsch wäre wie bei OneNote, das man alles einfügen kann (PDF / Excel / Word / Infos als Text). Diese Datei mit dem Inhalt sollte dann auf dem Server abgelegt werden, und alle anderen PC's können dann diese Datei öffnen und sich diese Informationen in der Datei ansehen (Excel, PDF ...).
Gibt es da schon etwas fertiges das man nutzen kann, eventuell kostenlos? Oder wie könnte man so etwas selber bauen, wenn der Aufwand nicht zu riesig wäre.
OneNote wäre da ja nicht schlecht, aber ich weiss natürlich nicht wie sich das verhält, wenn die Datenmenge mal riesig ist.
Ansosnten wäre ich auch ein Fan von einer Dateistruktur, wo die Inforamtionen einzeln (PDF / Excel / Textdatei) abgelegt werden, somit können diese auch bei Systemproblemem eventuell immer noch gesichtet werden. Aber dazu müßte man dann etwas haben, was die Dateien automatisch untersucht und daraus die Links in eine PDF ode so etwas transferiert. Dann könnte man von jedem Rechner diese Datei anzeigen, die User können dann den betreffenden Link anklicken und die jeweilig Datei wird geöffnet.
Warum will man das haben? Damit man eine schnelle Übersicht über Informationen hat, die dann bei vielen anderen Aufträgen genau identisch sind und somit man sofort alle Daten auf einen Blick öffnen kann.
Hi T-Virus, es hat geklappt. Das macht wirklich einiges aus an Zeit, da brauche ich an die eigentliche Frage erst gar nicht denken.
Vielen Dank
Ja, danke erst mal für eure Infos. Habe mir gerade das mal mit dem HashSet angesehen. Das werde ich als erstes mal implementieren und die Daten der List darin abbilden.
Jetzt noch zu dem anderen was ich noch äußern möchte, aber bitte nicht falsch verstehen, eventuell täusche ich mich da auch.
Also in der Vergangenheit hatte ich mich auch schon daran versucht, Verarbeitungen die längere Rechenzeit benötigen zu parallelisieren. Dazu gibt es ja die TaskParallel, mir Parallel.Foreach() usw ...
Ich hatte solche dinge auch schon ausprobiert, jetzt kommt das aaabbbeeer von mir ...
Ich habe z.B. eine Anwendung, mit der werden Programmdateien verarbeitet. Wenn ich zu Beginn nur 10000 Dateien untersuchen muss, aber nach 10 Monaten sind es 300000 Dateien, und die ganze Abarbeitung war bisher sequentiell in einer Methode, dann brauch ich für die 300000 Dateien mittlerweile eine immense Zeit für die Verarbeitung, und was mit dabei auffällt, wenn man mit Parallel.Foreach() arbeitet, dass ja zwischendurch Objekte gesperrt sind, wegen lock(), denn da wird kurz auf eine Datenmenge zugegriffen und damit ist diese kurz gesperrt. Deshalb wäre meine Idee mit dem Aufteilen der Daten, somit gäbe es keinen lock() und jeder Task arbeitet für sich, keine Sperrung wegen DataRace ... das war meine Idee hinter dieser ganzen Sache. Habe ich das verständlich für euch erklären können? Versteht ihr nun was ich meine? Wäre meine Idee in diesem Fall schneller als Parallel.Foreach() ??
Das Problem ist das in der List Dateiinfos enthalten sind die ich mit den Datensätzen der Datentabelle vergleichen muss. Mit dem Hashset habe ich noch nie gearbeitet, wenn das funktionieren sollte?
Aber das Prinzip der Vorgehensweise wäre richtig?
Es ist das Problem das je nachdem in den einen oder anderen Task ein Fehler geworgen wird. Ich habe mal den Tasks die Prozessorkernnummer der Schleife mitgegeben und gebe due in der Konsole aus, die ist in allen Tasks gleich, das ist seltsam.
Hallo, zusammen, ich brauche mal eine Rat der Community.
Also, ich habe einen Algorhytmus, der Dateien in einem Verzeichnis analysiert und Daten in eine Datentabelle schreibt. Die Dateien können sich täglich ändern, neue dazu, alte raus, werden editiert usw. Das stelle ich alles fest und aktualisiere somit die Datentabelle. Nun braucht die Verarbeitung nun mehrere Minuten, und ich würde das gerne beschleunigen, hatte auch schon mit der Ablaufoptimierung einiges erreicht.
Nun vermute ich, das ich weitere Zeit gutmachen könnte, wenn ich den Prozess parallelisiere. Ich bin daran, das ich den Prozess aufteile, und zwar anhand der Anzahl der Prozessorkerne die der Rechner vorweisen kann. Dann hätte ich das so gemacht, das ich die Verarbeitun in einer Methode mache. Diese Methdoe dient dann für die Anzahl der Tasks = Prozessorkerne und lasse die dann alle abarbeiten (parallel) und warte dann darauf das alle Tasks abgearbeitet sind. Ichhabe mal so einBeispielcode erstellt, wie das unefähr sein soll.
Wo ich mir nicht sicher bin, darf ich die identische Methode in zig Tasks gleichzeitig verwenden, oder macht das Probleme? Die Daten die in der Methode verarbeitet werden sollten so wie ich die übergebe voneinander unabhängig sein und nichts mit lock() gesperrt werden.
/* ========================================================================================================================================================================*/
/// <summary>
/// Test um eine Bearbeitungsroutine auf mehrere Tasks gleichmäßig aufzuteilen und parallel ablaufen zu lassen
/// </summary>
private void TaskTestle()
{
int startWertVeraenderlich = 0;
int teilmenge = tblDatensaetze.Rows.Count / Environment.ProcessorCount;
List<Task> lstTasksZuLoeschendeDatensaetze = new List<Task>();
for (int prozNr = 0; prozNr < Environment.ProcessorCount; prozNr++)
{
//// Startwert für den Bereich der Datentabelle mit den Datensätze immer mit jedem Durchgang erhöhen
startWertVeraenderlich *= teilmenge;
//// Neuen Task erzeugen (alle diese Tasks verwenden die identische Methode), den Task der Taskliste zufügen
Task task = new Task(() => { DetektiereVerwaisteDateien(Lst_DateienInVereichnis.ToList<ProgInfos>(), tblDatensaetze.AsEnumerable().Skip(startWertVeraenderlich).Take(teilmenge).CopyToDataTable()); });
lstTasksZuLoeschendeDatensaetze.Add(task);
}
//// Nun jeden Task starten
foreach (Task tsk in lstTasksZuLoeschendeDatensaetze)
{
tsk.Start();
}
//// Dann warten bis "alle !!!" Tasks fertig sind
try
{
Task.WaitAll(lstTasksZuLoeschendeDatensaetze.ToArray(), new TimeSpan(0, 0, 60));
}
catch (AggregateException agEx)
{
}
catch (OperationCanceledException agEx)
{
}
catch (Exception ex)
{
}
}
/* ========================================================================================================================================================================*/
/// <summary>
/// Entfernt die Datensaetze welche auch in der List<> existieren, alle übrigen Datensätze müssen somit noch gesondert verarbeitet werden
/// </summary>
/// <param name="lstDateien">List mit den Dateien im Verzeichnis</param>
/// <param name="tblDatensatzMengenbereich">Teilmenge der Datentabelle aufgeteilt nach Prozessorkernen</param>
private void DetektiereVerwaisteDateien(List<ProgInfos> lstDateien, DataTable tblDatensatzMengenbereich)
{
for (int datSatzNr = 0; datSatzNr < tblDatensatzMengenbereich.Rows.Count; datSatzNr++)
{
if (lstDateien.Contains(tblDatensatzMengenbereich.Rows[datSatzNr]["DateinameMitPfad"].ToString()))
{
datSatzNr--;
tblDatensatzMengenbereich.Rows.RemoveAt(datSatzNr);
}
}
}
/* ======================
Ok, ja.
Die IT hat sich heute morgen schon offenbart, es wird eine weiter ADirectory geben, dann kann das so weiterlaufen wie bisher.
Hallo Abt, danke für die Info. Aber Prizipiell wird das in die Richtung mit dem Webservice gehen? Ich meine, ist da die Berechtigungseinschränkung weniger restriktiv?
Beim Webservice brauche ich ja definitiv immer zwei Seiten, den Client und den Server. Die Terminals wären die Clients .... das heißt dann ich bräuchte noch eine Serverfunktionalität mit ASP oder dergleichen .... korrekt? Über Commands muss ich dann etwas beim Server antriggern ...
Da fällt mir ein, so etwas könnte man dann auch per MQTT oder OPC-UA steuern, wobei MQTT ja keine Datein versendet ...
Hallo zusammen, manche werden schon die Stirn runzeln, wenn sie schon die Überschrift lesen.
Aber der Reihe nach, ich fasse mal zusammen. In unserer Firma (gehört zu einem Konzern), sind alle Mitarbeiter-PC' in der Domäne eingegliedert, habe somit Berechtigung auf unsrere Server, je nachdem was für die User konfiguriert ist.
Jetzt haben wir auch noch Windows-Terminals, die sind nicht in der Domäne (oder jedenfalls nicht der angemeldete User), somit haben diese Terminals nun auf bestimmte Netzwerkbereiche keinen Zugriff. Diese Terminals sind für die Auftragswerfassung nötig. Dafür habe ich auch eine Applikation geschrieben, die aus dieser Auftragssoftware heraus angesprochen werden kann. Es wird eine ausführbare "EXE-Datei" mit Übergabeparameter gestartet, damit werden einmal gewisse Dinge in SAP geprüft, zum anderen werden aber auch PDF-Dateien zum Auftrag geprüft, und wenn diese vorhanden sind werden diese angezeigt.
Und hier ist jetzt mein Problem. Diese Netzwerkressource auf der diese PDF's abgelegt werden, wurde vor einer Woche ersetzt, weil diese nicht mehr den aktuellen Richtinien entsprochen hat, somit sind jetzt auch die Rechte "futsch".
Nun muss ich mir überlegen wie man das allgemein für diese Terminals wieder zum Rennen bekommt. Es soll auch eine kostengünstige uns ressourcenschonende Möglichkeit sein (Geräte sind noch gut), eventuell dann auch für spätere Transfers zu verwenden.
Folgende dinge habe ich schon angedacht, aber ich bin in der Abwägung was das beste, schnellste, einfachsteist zuweit weg weil ich die Erfahrung damit nciht habe. Hier mal Punkte, was ich mir gedacht habe:
Gibt es einen WebService oder kann man das relativ leicht selber machen, mit dem ich Dateien aus einem Verzeichnis erfassen und lesen kann, ohne dass der angemeldete User von dem Terminal Zugriff auf den Netzwerkbereich hat (Netzlaufwerk) ?? Gibt es da schon fertige DLL's die ich in C# verwenden kann? Eventuell wäre das auch eine Lösung für Maschinen die noch mit einem alten Betriebssystem arbeiten, um Dateien auszutauschen ??
Impersonation, ich weiss nicht ob das aus der Anwendung heraus funktionieren kann, wenn man für die Auswertung der PDF-Dateien und das anzeigen der PDF's im Code einen anderen user vorschaltet, der in der Konzerndomäne bekannt ist ??
Eine ausführbare Datei oder Batch mit den Argumenten die notwendig sind aufrufen. Die Batch müßte dann auch mit einem User arbeiten, welcher der Konzernsomäne bekannt ist. Wäre so etwas möglich?
Sonstige Ideen von euch ??
Ihr seht, ich bin mir sehr unschlüssig was ich genau machen soll oder was allgemein die beste oder alltagstaugliche Lösung wäre.
Bin jetzt echt etwas am Boden, denn diese bisherige Lösung hatte ich vor zwei Jahren mit diesen Kollegen erstellt, und jetzt das ...