From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable autolearn_force=no version=3.4.4 X-Received: by 10.50.66.210 with SMTP id h18mr5775182igt.11.1440783646123; Fri, 28 Aug 2015 10:40:46 -0700 (PDT) X-Received: by 10.182.213.164 with SMTP id nt4mr179798obc.39.1440783646094; Fri, 28 Aug 2015 10:40:46 -0700 (PDT) Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!news.eternal-september.org!mx02.eternal-september.org!feeder.eternal-september.org!news.glorb.com!u8no129812igq.0!news-out.google.com!f6ni7968igi.0!nntp.google.com!se8no166885igc.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail Newsgroups: comp.lang.ada Date: Fri, 28 Aug 2015 10:40:45 -0700 (PDT) In-Reply-To: Complaints-To: groups-abuse@google.com Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=80.189.40.249; posting-account=DQbqYQoAAACn8hHn2LmG2aF7Mhbxl_Lf NNTP-Posting-Host: 80.189.40.249 References: User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <75714e3f-c047-413d-9aa5-3ff423167863@googlegroups.com> Subject: Re: Exclusive file access From: ahlan@marriott.org Injection-Date: Fri, 28 Aug 2015 17:40:46 +0000 Content-Type: text/plain; charset=ISO-8859-1 Xref: news.eternal-september.org comp.lang.ada:27630 Date: 2015-08-28T10:40:45-07:00 List-Id: Our working solution was to use the Windows API to open the file and then use Windows API calls to read and write to it. We did this because using OA there wasn't a way to open files with non-ascii file names. However it meant that we had to write our own filing system. Now that we have abandoned OA in favour of Gnat and because Gnat provides a mechanism to open files with non-ascii names I had hoped that we could abandon all this fancy windows stuff and use plain Ada. The hope was that it would also be platform independent. >From what everyone has written it seems that this is not possible. It seems that I should somehow lock the file once it has been opened by Ada. Has anyone any suggestions how best to do that? Ie How does one write a GNAT Ada program for windows that has exclusive access when opened for write. Surely this must be a common requirement? On Thursday, August 27, 2015 at 3:52:36 PM UTC+2, ah...@marriott.org wrote: > Dear All, > > Obviously I'm misunderstanding something here. > > I thought that if two processes tried to open the same file for write access then the second process would get an exception. > > I have a simple example which when compiled using GnatPro 7.3.1 and run under 32-bit Windows XP demonstrates that this is not so. > > Which then begs the question on how to detect if the file is in use and abort if it is. > This should be simple but obviously too complex for my tiny brain. > Does anyone know how to do this from Ada (without resorting to the OS directly)? > > My simple test program is > > package body Test is > > package Io renames Ada.Text_IO; > > procedure Work is > The_File : Io.File_Type; > begin > Io.Open (The_File, Io.Out_File, "Test.Txt"); > for Count in Natural'value(Ada.Command_Line.Argument(1)) .. Natural'value(Ada.Command_Line.Argument(2)) loop > Io.Put_Line (The_File, "Count =" & Count'img); > Io.Put_Line ("Count =" & Count'img); > delay 1.0; > end loop; > Io.Close (The_File); > exception > when others => > Io.Put_Line ("Exception"); > end Work; > > end Test; > > If I execute this from one process with parameters 1 10 and then when it reaches 8 start the program again from a second process with parameters 3 7 on the same machine, the resultant file is a nice mixture! :-( > > Count = 3 > Count = 4 > Count = 5 > Count = 6 > Count = 7 > Count = 6 > Count = 7 > Count = 8 > Count = 9 > Count = 10 > > This is not what I want. I want what the first instance produces and the second instance to fail. Surely nobody would want otherwise ;-) > > Best wishes, > Ahlan