Fråga om hantering av filer i C och Linux/Windows.

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Fråga om hantering av filer i C och Linux/Windows.

Inlägg av lillahuset »

Vi har ett program som genererar data till en loggfil. Det öppnar filen (append), skriver data, stänger filen. Vi har ingen kontroll över när det sker.
Vi tänker skriva ett program som läser filen, konverterar och slutligen raderar infilen. Ett "krav" är att vi inte förlorar data.

Första tanken var att låsa filen när den används men det känns lite stökigt. Andra tanken var att byta namn på filen, avvakta tills storleken inte ändras och sedan konvertera och radera.

Ett litet test med Linux visar att det borde gå och att vi inte verkar förlora data. Kan man vara säker på att det är tänkt att vara så? Hur är det i Windows?

Eller tänker jag fel?
Johanb
Inlägg: 3406
Blev medlem: 26 mars 2006, 22:26:12
Ort: Smedjebacken

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Johanb »

Kan du skriva till en named pipe som programmet läser alternativt köra

Kod: Markera allt

tail -f logfil | program
Användarvisningsbild
Icecap
Inlägg: 26148
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Icecap »

Når jag gör detta i Windows öppnar filen, sätter filpekaren till slutet av filen, skriver vad som ska skrivas och stänger filen.

I Windows sättas filpekaren med "SetFilePointer(Handle, 0, 0, FILE_END);" där 'Handle' är filehandle.
Nerre
Inlägg: 26709
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Nerre »

Som jag förstår det så finns det ingen möjlighet att modifiera programmet som skriver filen, hela frågan handlar om att kunna läsa den (utan att förlora data).

Att köra via tail lär ju inte funka under Windows... annars hade det nog varit en bra idé. Men det faller ju på att man riskerar att tappa data som skrivs innan tail startas.

Jag tror inte att man i Windows kan döpa om en fil som det skrivs till (i Linux kan man väl det, program som hade filen öppen fortsätter att skriva till den omdöpta filen, det är därför man vid logg-rotation kan behöva starta om processer för att de ska "släppa" den gamla roterade loggfilen).
Användarvisningsbild
Icecap
Inlägg: 26148
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Icecap »

Ah - missade den biten, läste slarvigt.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av lillahuset »

Teoretiskt skulle vi kunna få programmet som genererar filen ändrat. Men vi har ingen lust att röra till den änden om vi inte måste.

Funkar inte fopen("filnamn", "a") i C i windows? Då hamnar data i slutet och filen skapas om den inte existerar.

Jo i linux, iallafall i miljön på laptopen, funkar det utmärkt att fortsätta att skriva till en fil som någon har bytt namn på. När man sedan stänger den och öppnar en fil med samma namn får man en ny fil.

Jag tycker det verkar rimligt att det går i windows också. Men vad vet jag.

Programmet jag genererar testdata med:

Kod: Markera allt

#include <stdio.h>
int main(void)
{
  int i;
  FILE *fp;

  for (;;) {
    fp = fopen("num.txt", "a");

    for (i = 0; i < 100; i++) {
      fprintf(fp, "%d\n", i);
    }

    fclose(fp);
  }

} /* main */
Användarvisningsbild
Icecap
Inlägg: 26148
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Icecap »

I Windows ska man ange om man vill dela filen med andra när man öppnar den och i så fall om det är "bara dela läsa", båda läsa & skriva eller bara skriva. Så du kan mycket väl riskera att bli nekad tillträde.
Användarvisningsbild
Jan Almqvist
Inlägg: 1581
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Jan Almqvist »

Användarvisningsbild
Icecap
Inlägg: 26148
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Icecap »

HANDLE hFile=CreateFile(L"D:\\a.dat", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

Om man använder FILE_SHARE_NONE är den låst för andra till man har jobbat klart med den.
Nerre
Inlägg: 26709
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Nerre »

Frågan är ju då som sagt var om programmet i fråga (som de har små möjligheter att påverka) öppnar filen som FILE_SHARE_READ eller NONE.

Och går det att döpa om en fil som är öppnad som FILE_SHARE_READ?
Användarvisningsbild
Krauser
Inlägg: 381
Blev medlem: 28 september 2014, 19:16:55

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Krauser »

Finns det nån typ av numrering eller timestamp på den data som skrivs?

Kanske är att krångla till det men om du läser filen, konverterar, jämför sista raderna, om det stämmer radera.
Alternativt istället för radering, töm filen på allt utom dom 5-10 sista posterna och sortera bort dom vid nästa konvertering.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av lillahuset »

För Linux verkar det vara en fullt fungerande och enkel lösning att döpa om filen och vänta tills det inte kommer mer data till filen innan man hanterar den.

Krauser: Det finns tidsstämplar på alla data men man vet aldrig när "producenten" vill producera mer data. I princip skulle det kunna räcka att solen gick upp eller vad som helst annat. Och om man då ändrar filen vid soluppgången kan det bli problem. Om filen däremot ändras när "producenten" stänger den blir det helt rent. "Producenten" märker inget och "konsumenten" har full koll eftersom ingen annan vet vad filen heter.

Edit, förtydligande: "Producenten" är inte det minsta intresserade av historiska data så den skapar bara en ny fil.

Varför använder man inte ANSI C när man programmerar för Windows? Jag är medveten om att man ibland avviker från ANSI C när man programmerar för Linux men tycker att man ska undvika det om möjligt.
mAVRick
Inlägg: 319
Blev medlem: 19 mars 2013, 12:43:43
Ort: Östersund

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av mAVRick »

I linux iaf så är inte filnamnet den unika identidieraren för filen, utan dess inod. Om ett program öppnar filen och har ett filehandle till den, så kan man t.ex ta bort filen och den den 'försvinner' när man listar (ls), men programmet kan fortfarande läsa/skriva filen. Det är först när det inte finns öppna filehandles till den inoden som den tas bort på riktigt.
Vi har nämligen haft liknande problem, med logfiler som roterats (logrotate) men programmet har inte släppt inoden, med följden att vi fått slut på disk då filer som inte 'finns' har ätit upp all diskyta.

Så, förutsatt att programmet skapar filen om den inte finns när den öppnar och att det stänger filen när den skrivit, är det säkert att byta namn på filen utan att tappa data.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av lillahuset »

Och det är för mig en tilltalande egenskap. :)
Men hur är det i Windows? Om (han däruppe förbjude) det kommer krav på portning till Windows. Hur ser NTFS på filer? Som inoder (pekare till beskrivningar av filer) eller som något med ett specifikt namn?
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Fråga om hantering av filer i C och Linux/Windows.

Inlägg av Mr Andersson »

lillahuset skrev:Varför använder man inte ANSI C när man programmerar för Windows? Jag är medveten om att man ibland avviker från ANSI C när man programmerar för Linux men tycker att man ska undvika det om möjligt.
För mig så är svaret brist på kontroll. Med fopen() kan du inte sätta delningsrättigheter, ACL:er, etc. Givetvis beror det också på vad syftet med filöppnandet är. Ska jag bara lite snabbt öppna en fil, läsa eller skriva lite data och sen stänga filen igen fungerar fopen utmärkt. Men ska filen hållas öppen en längre tid eller om flera program behöver öppna den samtidigt måste man använda CreateFile-API:et.

fopen (i Microsofts standard-C-library iaf, har inte testat något annat under windows) tillåter inte att du tar bort eller byter namn på en fil som hålls öppen. Använder du CreateFile med FILE_SHARE_DELETE fungerar det som i Linux på samma sätt som mAVRick beskrev ovanför.
Skriv svar