neuerdings werden bei mir im Projektmappenexplorer auch bin- und obj-Verzeichnisse angezeigt( siehe Bild als Dateianhang ). Das nervt. Kennt einer von Euch dieses Problem und weiß, wie man das abstellt ?
Entwicklungsumgebung : Visual Studio 2010 Express Edition / C#
Ich selber habe das Tool - wie ich gestehen muß - nicht unter XP getestet. Aber ein anderer User sagte, es würde unter XP SP2, Visual Studio 2008 laufen.
Die nächste Version werde ich dann mal für TargetFramework = 3.5 und 4.0 kompilieren, dann müßte ja eine der beiden Versionen auch bei Dir laufen.
Ich melde mich dann nochmal ( wird wohl Mitte Oktober werden ).
wenn das Problem wirklich die Pfadlänge sein sollte, kannst du zum Kopieren die API-Funktion CopyFile benutzen. Wenn du bei dieser Funktion das Prefix "\\?\" vor die Pfadangabe setzt, kannst du mit Pfadangaben bis zu einer Länge von 32767 Zeichen arbeiten.
Unter File Management Functions findest du eine Übersicht über alle Dateifunktionen, die die API bietet und die alle mit langen Pfadangaben klarkommen.
Bei deinem ursprünglich geposteten Code würde es so gehen :
using System;
namespace ConsoleApplication1
{
[Flags]
public enum ReadOptions : uint
{
eins = 0x01,
zwei = 0x02,
vier = 0x04
}
class Program
{
static void Main(string[] args)
{
for (int bit = 0; bit ≤ 7; bit++)
{
int value = (int)Math.Pow(2, bit);
if (Enum.IsDefined(typeof(ReadOptions), (ReadOptions)value))
{
Console.WriteLine("{0} - {1}", bit, ((ReadOptions)value).ToString());
}
else
{
Console.WriteLine("{0} - not defined", bit);
}
}
Console.ReadKey();
}
}
}
ich habe gerade ein kleines Programm geschrieben, das man im Visual-Studio-Postbuild aufrufen kann, um Exe und Dll zusammenzufügen. Näheres findest du hier.
ich habe ein kleines Programm (vs-postbuild.exe) erstellt, das mehrere .NET-Assemblies (exe, dll) zu einer Assembly vereinigt.
Das Programm benutzt die Funktionalität von Microsoft's ILMerge.exe.
Es kann im Postbuild von Visual Studio aufgerufen werden.
Die im Projekt referenzierten Assemblies können der Haupt-Assembly hinzugefügt werden.
Laufen tut das Ganze unter :
Windows Vista / Windows 7
Visual Studio 2008 / Visual Studio 2010
mit .NET-Framework 3.5 oder höher
Die Programmbeschreibung und den Download zur aktuellen Version gibt es unter vs-postbuild.de
Gruß
Michael Schmitz
Bisherige Versionen:
postbuild.zip (571 KB, 4 mal heruntergeladen)
postbuild.zip (571,05 KB, 5 mal heruntergeladen)
postbuild.zip (588 KB, 69 mal heruntergeladen)
postbuild.zip (127 KB, 27 mal heruntergeladen)
vielleicht liefert die Funktion GetEncoderInfo einen nachträglich installierten Codec, der nicht funktioniert. Mit dem Build-In-Jpeg-Encoder funktioniert das bei mir einwandfrei.
ich habe vor einiger Zeit mal mit Visual C# 2008 für Vista eine Funktion geschrieben, um den Inhalt des Master File Tables zu lesen. Dabei habe ich mit CreateFile (API) ein Handle auf das Volume erstellt und dann mit SetFilePointerEx (API) und ReadFile (API) die Bytes direkt vom Volume gelesen. Das hat einwandfrei funktioniert. Vorraussetung ist allerdings, daß man Administratorrechte hat.
Der Aufruf für CreateFile erfolgte dabei mit den folgenden Parametern :
ich habe festgestellt, daß daß ein try-catch-Block in der main-Funktion eine unbehandelte Exception nicht mehr abfängt, wenn die Funktion Application.Run(MainWindow) erst einmal aufgerufen worden ist.
Um danach auftretende unbehandelte Exceptions abzufangen, solltest Du am Anfang der main einen Eventhandler registrieren.
das kannst du mit DataGridView.ColumnHeadersDefaultCellStyle.WrapMode steuern.
Wenn Du WrapMode = DataGridViewTriState.False setzt, erfolgt kein Umbruch.
Die Einstellung gilt dann für alle Columns des DataGridViews.
Wenn du das nur für eine bestimmte Column setzen möchtest, setzt du für die entsprechende Column : DataGridViewColumn.DefaultCellStyle.WrapMode.
ob ein Schlüssel existiert, kannst du wie folgt abfragen :
using Microsoft.Win32;
RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\TEST");
Object value = key.GetValue("XYZ");
Mit diesem Aufruf wird der Schlüssel zum Lesen geöffnet.
Wenn der Schlüssel nicht existiert, erhälst Du für key null zurück.
GetValue liest dann den Wert eines Eintrags, der unter diesem Schlüssel liegt.
wenn es um die Anzahl der Dateien und Verzeichnisse auf einem Laufwerk geht, helfe ich mir folgendermaßen :
ich lese mit der API-Funktion GetFileSizeEx die Größe des Master-File-Tables ($MFT).
Dann lese ich mit der API-Funktion DeviceIoControl den NTFS_VOLUME_DATA_BUFFER . Dieser enthält die Größe eines MFT-Records (BytesPerFileRecordSegment).
Ich teile dann die Größe des MFT durch die Größe eines Records und tue dann so, als ob jeder Record für eine Datei oder ein Verzeichnis steht. Das funktioniert in der Praxis meist ganz gut.
Wie man die Anzahl der Dateien in einem Verzeichnis ohne Scan herausfindet, weiß ich nicht; und ich glaube Windows weiß es auch nicht, denn wenn Du im Windows-Explorer bei einem Verzeichnis auf Eigenschaften klickst, wird ja ein Scan des Dateisystems durchgeführt, um die Anzahl zu ermitteln.
Gruß
Michael Schmitz
PS:
Der Scan des Dateisystems geht mit den API-Funktionen FindFirstFile und FindNextFile recht flott. Bei einer Systempartition mit 60.000 Dateien und Verzeichnissen geht das bei mir in 15 sec.
bei der Variante mit dem ThreadPool habe ich folgendes Problem :
Ich rufe nur eine Funktion auf, kann also keine while(!m_aborted)-Schleife bauen und bin somit darauf angewiesen, nach dem Timeout den Thread mit Thread.Abort abzubrechen. Beim ThreadPool bekomme ich ja keine Referenz auf den gestarteten Thread; oder gibt es da eine Möglichkeit ?
wenn ich die API-Funktion GetVolumeInformation für ein Volume aufrufe das nicht bereit ist ( z.B. CD/DVD oder Floppy) kann es lange dauern, bis die Funktion zurückkehrt.
Wie kann ich da einen Abbruch oder Timeout programmieren ?
ich habe eine GUI und zwei Backgroundworker;
und folgende Verständnisfrage:
Für die Zugriffe von den Backgroundworkern auf die Controls der GUI ist ja Invoke/BeginInvoke notwendig, da die Aufrufe der Funktionen der Controls nur von dem Thread aus erfolgen dürfen, der die Controls erstellt hat.
Aber was ist mit der Kommunikation zwischen den beiden Backroundworker ?
Ist es Nicht-Control-Objekten egal welcher Thread zugreift ?
Reicht es da zu locken oder gibt es noch etwas zu beachten ?
ich habe ein DataGridView.
Die Rows enthalten in der ersten Spalte eine DataGridViewCheckBoxCell.
Das Problem ist folgendes:
Wenn ich in einer Cell das gesetzte Häckchen entfernen will, indem ich DataGridViewCheckBoxCell.Value = false setze, wird die Anzeige nicht aktualisiert.
Das Objekt ist geändert, aber die Oberfläche wird nicht aktualisiert.
Ich habe es bereits mit DataGridView.Invalidate() und DataGridView.Update() versucht, aber ohne Erfolg.
Das DataGridView sitzt auf einer Registrierkarte. Wenn ich zu einer anderen Registrierkarte wechsle und dann wieder zurückgehe zu der Registrierkarte auf der das DataGridView sitzt, ist die Aktualisierung erfolgt und das Häckchen entfernt.
ich habe ein DataGridView erstellt und VirtualMode = true gesetzt und eine Funktion OnCellValueNeeded gebaut.
Das funktioniert auch, die Zellen werden korrekt gefüllt.
Aber : die Funktion OnCellValueNeeded wird für alle Zellen aufgerufen, bevor das DataGridView zum ersten mal angezeigt wird.
Ich dachte, die Funktion würde nur für die Zellen der ersten 20 sichtbaren Zeilen aufgerufen und erst dann wenn der Benutzer nach unten scrollt die Werte für die folgenden Zellen nachgeladen.