Toon posts:

[C# / Delphi] Delphi FileDate omzetten naar C# datumtype*

Pagina: 1
Acties:

Verwijderd

Topicstarter
Een aantal jarengeleden heb ik een archief-app geklust in Delphi, nu wil deze herschrijven in C#. Nu heb ik dus een exportfile met daarin een int waarde als datetime. Delphi noemt dat een FileDate.
Deze toon ik dan binnen delphi door deze in te lezen en de functie

code:
1
eenstring := DateToStr( FileDateToDateTime( FTime) );

aan te roepen. ook nog even het wegschrijven van deze filedate naar een ASCII bestand.
code:
1
2
3
4
5
6
7
            vMemoryStream.Read( FTime, SizeOf( Integer ) );

            if ( FExportToFile ) then
            begin
              tmpString := GetFullTreeNodeName( Self.Items[ FID ], tmpString );
              Writeln( FMyFile, FName + '|' +  IntToStr(FSize) + '|' + IntToStr(FTime) + '|' + IntToStr(FID) );
            end

vraag: Hoe lees ik deze filedate correct in C# ? op een of andere manier moet ik alleen de datum hebben, maar dat inlezen lukt maar niet. voorbeeld ASCII file:

10/13/2005 = ascii filedate: 860727085

Stargate SG1 7x03 - Fragile Balance.avi|368066560|860727085|1|\Stargate SG1 - Season 7
Stargate SG1 7x04 - Orpheus.avi|368420864|860727145|1|\Stargate SG1 - Season 7
Stargate SG1 7x05 - Revisions.avi|365754368|860727342|1|\Stargate SG1 - Season 7
Stargate SG1 7x06 - Lifeboat.avi|319092736|860727396|1|\Stargate SG1 - Season 7

Heb verschillende manieren geprobeerd met C# DateTime maar het lukt maar niet...
Iemand een idee? Alvast bedankt!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-03 14:33

NMe

Quia Ego Sic Dico.

Ik dacht dat Delphi UNIX-timestamps opsloeg, maar zo te zien is 860727085 dan geen 10/13/2005 maar 11/04/1997. UNIX-timestamps zijn het dus in elk geval niet. Staat er nergens in de help wat voor formaat dit is?

offtopic:
Stargate _O_

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Die FTime komt uit de FileAge of FileGetDate functie? De Delphi help zegt daar over het volgende:
Returns the OS timestamp of a file.
Als je de code bekijkt van die functies zie je dat de FileTimeToDosDateTime winapi functie wordt gebruikt. Daar kan je tevens vinden wat het getal betekend. Delphi stopt het Date gedeelte in het High gedeelte van de integer en het tijd gedeelte in de Low.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Thanks, daar kan ik wat mee, nu heb ik de volgende code geklust en kan het juiste jaartal dus vinden. Hoe kan ik in C# nu apart de tussenliggende bits omzetten naar een nummer, zodat ik dus ook de maand en dag krijg?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
UInt32 val = 860727085;              // 10/13/2005 = de juiste datum horende bij dit getal
UInt32 h_end = val >> 16;           // high end van UInt32 grabben, zoals in vorige post

Console.WriteLine("unsigned int-value       : {0}", val);
Console.WriteLine("unsigned low-intvalue    : {0}", val - h_end );
Console.WriteLine("unsigned high-int-value  : {0}", h_end);

Console.WriteLine("year: {0}", ( h_end >> 9 ) + 1980 );    // :-) het jaar!
Console.WriteLine("maand: {0}", ( h_end >> 5 ) + ( h_end << 8 ) );    // maand??? :?
/*
Bits    Description
0..4    Day of the month (1&#8211;31)
5..8    Month (1 = January, 2 = February, etc.)
9-15    Year offset from 1980 (add 1980 to get actual year)
*/


Kortom, hoe haal ik bit 5 tot 8 uit deze h_end UInt32 ??? En bit 0 tot 4? Dit is vast heel simpel, maar je moet het net even weten, zoals met alles. Ben nog niet zo'n bit-shift pro. :P

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-03 14:33

NMe

Quia Ego Sic Dico.

Als C# op C++ lijkt:
C#:
1
2
3
4
//High nibble:
Console.WriteLine("bit 4-7: {0}", h_end >> 4);
//Low nibble:
Console.WriteLine("bit 0-3: {0}", h_end & 0x0F);

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
-NMe- schreef op zaterdag 04 maart 2006 @ 19:17:
Als C# op C++ lijkt:
C#:
1
2
3
4
//High nibble:
Console.WriteLine("bit 4-7: {0}", h_end >> 4);
//Low nibble:
Console.WriteLine("bit 0-3: {0}", h_end & 0x0F);
Console.WriteLine("bit 0-3: {0}", h_end & 0x0F); geeft 13, de dag dus top... :*)
alleen de maand .... bit 4...7 is niet flex, moet maand '10' uitkomen

Console.WriteLine("bit 4-7: {0}", h_end >> 4 - h_end >> 7) geprobeerd, gaar... |:(

kun je anders even uitleggen welk getal ik eraf moet halen om alleen bits 4 tm 7 over te houden
richting een getal. Dan snap ik ook beter hoe het werkt. Met de dag gooi je er 15 bij d.m.v. een AND operator, en zo hou je 13 over. De bits op het scherm tonen doe ik met BitArray (lang leve NET) en zo zie ik welke bits aan staan en welke niet, dus dat klopt. Alleen hoe rip ik dus alleen bit 4 tm 7 en parse ik die naar een waarde.?

[ Voor 19% gewijzigd door Verwijderd op 04-03-2006 20:47 ]


Verwijderd

Verwijderd schreef op zaterdag 04 maart 2006 @ 13:04:
Een aantal jarengeleden heb ik een archief-app geklust in Delphi, nu wil deze herschrijven in C#. Nu heb ik dus een exportfile met daarin een int waarde als datetime. Delphi noemt dat een FileDate.
Je maakt een grote fout door het een datetime te noemen. Moest een paar keer lezen, wat je nou bedoelde.
Verwijderd schreef op zaterdag 04 maart 2006 @ 13:04:
10/13/2005 = ascii filedate: 860727085
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
DOS date 860727085 = 13-10-2005 20:57:26
860727085 = 110011010011011010011100101101
11001 1010 01101  10100 111001 01101
  25   10    13    20     57   13*2

Met een beetje logisch nadenken kom je op ongeveer het volgende..

Jaar    = ((val & (11111 0000 00000  00000 000000 00000b)) >> 25) + 1980
Maand   = ((val & (00000 1111 00000  00000 000000 00000b)) >> 20)
Dag     = ((val & (00000 0000 11111  00000 000000 00000b)) >> 16)
Uur     = ((val & (00000 0000 00000  11111 000000 00000b)) >> 11)
Minuut  = ((val & (00000 0000 00000  00000 111111 00000b)) >> 5)
Seconde = ((val & (00000 0000 00000  00000 000000 11111b)) >> 0) * 2

[ Voor 13% gewijzigd door Verwijderd op 05-03-2006 02:06 ]

Pagina: 1